#pragma once#include"Constraint.h"#include"Eigen/Core"#include"vnl/vnl_math.h"#include<iostream>namespaceitk{classPlaneConstraint:publicConstraint{public:boolisViolated(constvnl_vector<double>&pt)const{Eigen::Vector3dpt_eigen;pt_eigen(0)=pt[0];pt_eigen(1)=pt[1];pt_eigen(2)=pt[2];returnisViolated(pt_eigen);}boolisViolated(constEigen::Vector3d&pt)const{doubledist=planeNormal.dot(pt-planePoint);if(dist<0)returntrue;returnfalse;}voidprintC()const{std::cout<<"normal "<<planeNormal.transpose()<<" point "<<planePoint.transpose()<<std::endl;}Eigen::Vector3dGetPlaneNormal(){returnplaneNormal;}voidSetPlaneNormal(constEigen::Vector3d&inPlane){planeNormal=inPlane;}Eigen::Vector3dGetPlanePoint(){returnplanePoint;}voidSetPlanePoint(constvnl_vector<double>&ina){Eigen::Vector3dpt_eigen;pt_eigen(0)=ina[0];pt_eigen(1)=ina[1];pt_eigen(2)=ina[2];planePoint=pt_eigen;}voidSetPlanePoint(constEigen::Vector3d&p){planePoint=p;}Eigen::Vector3dConstraintGradient(constEigen::Vector3d&pt)const{return-planeNormal;}doubleConstraintEval(constEigen::Vector3d&pt)const{doubleval=-planeNormal.dot(pt-planePoint);returnval;}private:Eigen::Vector3dplaneNormal;Eigen::Vector3dplanePoint;};}