📄 trianglulationview.cpp
字号:
u=0.6+0.2*cos(t);
v=0.5+0.3*sin(t);
firstpoint.x =(int)((1-u)*(1-u)*(controlpoint[0].x *(1-v)*(1-v)+2*controlpoint[1].x *v *(1-v)+controlpoint[2].x *v*v)
+2*u*(1-u)*(controlpoint[3].x *(1-v)*(1-v)+2*controlpoint[4].x *v *(1-v)+controlpoint[5].x *v*v)
+u*u*(controlpoint[6].x *(1-v)*(1-v)+2*controlpoint[7].x *v *(1-v)+controlpoint[8].x *v*v));
firstpoint.y =(int)((1-u)*(1-u)*(controlpoint[0].y *(1-v)*(1-v)+2*controlpoint[1].y *v *(1-v)+controlpoint[2].y *v*v)
+2*u*(1-u)*(controlpoint[3].y *(1-v)*(1-v)+2*controlpoint[4].y *v *(1-v)+controlpoint[5].y *v*v)
+u*u*(controlpoint[6].y *(1-v)*(1-v)+2*controlpoint[7].y *v *(1-v)+controlpoint[8].y *v*v));
firstpoint.z =(int)((1-u)*(1-u)*(controlpoint[0].z *(1-v)*(1-v)+2*controlpoint[1].z *v *(1-v)+controlpoint[2].z *v*v)
+2*u*(1-u)*(controlpoint[3].z *(1-v)*(1-v)+2*controlpoint[4].z *v *(1-v)+controlpoint[5].z *v*v)
+u*u*(controlpoint[6].z *(1-v)*(1-v)+2*controlpoint[7].z *v *(1-v)+controlpoint[8].z *v*v));
nextpoint.x =(int)(viewpoint.x +(firstpoint.x -viewpoint.x )*viewpoint.z /(viewpoint.z -firstpoint.z +0.0001))+500;
nextpoint.y =(int)(viewpoint.y +(firstpoint.y -viewpoint.x )*viewpoint.z /(viewpoint.z -firstpoint.z +0.0001));
pDC->LineTo (nextpoint.x ,nextpoint.y );
t=t+0.1;
}
}
void CTrianglulationView::triangulate()
{
//the coordinate of the points
CDC *pDC=GetDC();
/* pDC->SetPixel (mypoint[0].x ,mypoint[0].y ,1);
pDC->SetPixel (mypoint[1].x ,mypoint[1].y ,1);
pDC->SetPixel (mypoint[2].x ,mypoint[2].y,1 );
pDC->SetPixel (mypoint[3].x ,mypoint[3].y ,1);
pDC->SetPixel (mypoint[4].x ,mypoint[4].y,1 );
pDC->SetPixel (mypoint[5].x ,mypoint[5].y,1);
pDC->SetPixel (mypoint[6].x ,mypoint[6].y ,1);
pDC->SetPixel (mypoint[7].x ,mypoint[7].y ,1);*/
//init the edge
int i;
double error=1000.;
double d;
int pointnumber=-1;
int stackvary=0;
bool tag1=1,tag2=1;
bool change=1;
int edgenumber=-1;
double d1,d2,d3;
double ar;
int inside=0;
edgestack[0].number1 =0;
edgestack[0].number2 =1;
stacknum++;
while (change)
{
error=1000.0;
pointnumber=-1;
edgenumber=-1;
for (stackvary=0;stackvary<stacknum;stackvary++)
{
for (i=0;i<(pointnum);i++)
{
if ((IsVisual(edgestack[stackvary],i)==1))
{
// d=abs((threepoint(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i)-PI/3)*(threepoint(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i)-PI/3)
// +(threepoint(edgestack[stackvary].number2 ,edgestack[stackvary].number1 ,i)-PI/3)*(threepoint(edgestack[stackvary].number2 ,edgestack[stackvary].number1 ,i)-PI/3)
// +(threepoint(i,edgestack[stackvary].number1 ,edgestack[stackvary].number2 )-PI/3)*(threepoint(i,edgestack[stackvary].number1 ,edgestack[stackvary].number2 )-PI/3));
/* m=sqrt(3)/2;
d1=abc(AR(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i),m);
d2=abc(AR(i,edgestack[stackvary].number1 ,edgestack[stackvary].number2 ),m);
d3=abc(AR(edgestack[stackvary].number2 ,i,edgestack[stackvary].number1 ),m);
d=d1+d2+d3;
d1=(threepoint(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i)-PI/3)*(threepoint(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i)-PI/3);
d2=(threepoint(edgestack[stackvary].number2 ,edgestack[stackvary].number1 ,i)-PI/3)*(threepoint(edgestack[stackvary].number2 ,edgestack[stackvary].number1 ,i)-PI/3);
d3=(threepoint(i,edgestack[stackvary].number1 ,edgestack[stackvary].number2 )-PI/3)*(threepoint(i,edgestack[stackvary].number1 ,edgestack[stackvary].number2 )-PI/3);
d=d1+d2+d3;*/
// ar=AR(edgestack[stackvary].number1 ,edgestack[stackvary].number2 ,i);
d3=edge(edgestack[stackvary].number1,edgestack[stackvary].number2);
d1=abc(edge(edgestack[stackvary].number2,i),d3);
d2=abc(edge(edgestack[stackvary].number1,i),d3);
d=d1+d2;
// if ((d<error)&&(d1>0.1)&&(d2>0.1)&&(d3>0.1))
if (d<error)
{
error=d;
pointnumber=i;
edgenumber=stackvary;
}
}
}
}
if (pointnumber!=-1)
{
i=0;
inside =PointIsInside(edgestack[edgenumber].number1 ,edgestack[edgenumber].number2 ,pointnumber);
if (inside!=0)
{
pointnumber=inside;
}
while ((tag1==1)&&(i<=edgestacknum))
{
if (((pointnumber==edgestack[i].number1 )||(pointnumber==edgestack[i].number2 ))
&&((edgestack[edgenumber].number2 ==edgestack[i].number1 )||(edgestack[edgenumber].number2 ==edgestack[i].number2 )))
tag1=0;
i++;
}
if (tag1==1)
{
edgestack[stacknum].number1 =edgestack[edgenumber].number2 ;
edgestack[stacknum].number2 =pointnumber;
stacknum++;
}
tag1=1;
i=0;
while ((tag2==1)&&(i<=edgestacknum))
{
if (((pointnumber==edgestack[i].number1 )||(pointnumber==edgestack[i].number2 ))
&&((edgestack[edgenumber].number1 ==edgestack[i].number1 )||(edgestack[edgenumber].number2 ==edgestack[i].number2 )))
tag2=0;
i++;
}
if (tag2==1)
{
edgestack[stacknum].number1 =edgestack[edgenumber].number1 ;
edgestack[stacknum].number2 =pointnumber;
stacknum++;
}
tag2=1;
triangular[triangularnum].number1 =edgestack[edgenumber].number1;
triangular[triangularnum].number2 =edgestack[edgenumber].number2 ;
triangular[triangularnum].number3 =pointnumber;
triangularnum++;
}
else
change=0;
}
stackvary=0;
while (stackvary<stacknum)
{
pDC->MoveTo (mypoint[edgestack[stackvary].number1 ].x,mypoint[edgestack[stackvary].number1 ].y);
pDC->LineTo (mypoint[edgestack[stackvary].number2 ].x,mypoint[edgestack[stackvary].number2 ].y);
stackvary++;
}
}
bool CTrianglulationView::IsVisual(Edge edge, int number2)
{
//判断点point2对边edge是否可见
double b;
int number1;
bool Intersect1=0;
bool Intersect2=0;
int i;
double length;
bool isout;
if ((number2==edge.number1 )||(number2==edge.number2))
return 0;//点在直线上
/* int d;
d=(int)(fabs((mypoint[edge.number2 ].y -mypoint[edge.number1 ].y )*mypoint[number2].x -(mypoint[edge.number2 ].x -mypoint[edge.number1 ].x )*mypoint[number2].y
+(mypoint[edge.number1 ].y *mypoint[edge.number2 ].x -mypoint[edge.number2 ].y *mypoint[edge.number1 ].x ))
/sqrt((mypoint[edge.number1].y-mypoint[edge.number2].y)*(mypoint[edge.number1].y-mypoint[edge.number2].y)+(mypoint[edge.number1].x-mypoint[edge.number2].x)*(mypoint[edge.number1].x-mypoint[edge.number2].x)));
if (d<=5)
return 0;*/
number1=PointRelToEdge(edge);
RelPoint1=-1;
RelPoint2=-1;
isout=Isout(edge.number1 ,edge.number2 ,number2);
if (isout==0)
return 0;
if (number1==-1)
return 0;//没有任何点可见
if (number1==-2)
return 1;//任何点都是可见的
double b1,b2;
b1=(mypoint[edge.number1 ].x -mypoint[edge.number2 ].x)*mypoint[number1].y
+(mypoint[edge.number2 ].y -mypoint[edge.number1 ].y)*mypoint[number1].x
+mypoint[edge.number2].x *mypoint[edge.number1].y -mypoint[edge.number1].x*mypoint[edge.number2].y;
b2=(mypoint[edge.number1 ].x -mypoint[edge.number2 ].x)*mypoint[number2].y
+(mypoint[edge.number2 ].y -mypoint[edge.number1].y)*mypoint[number2].x
+mypoint[edge.number2].x *mypoint[edge.number1].y -mypoint[edge.number1].x*mypoint[edge.number2].y;
b=b1*b2;
if (b<0)
{
i=0;
while ((i<edgestacknum)&&(!Intersect1)&&(!Intersect2))
{
if ((((edgestack[i].number1!=edge.number1 )&&(edgestack[i].number2 !=edge.number2 ))
||((edgestack[i].number2 !=edge.number1 )&&(edgestack[i].number1 !=edge.number2 )))
||(((edgestack[i].number1 !=edge.number1 )&&(edgestack[i].number2 !=number2))
||((edgestack[i].number2 !=edge.number1 )&&(edgestack[i].number1 !=number2))))
Intersect1=IsIntersect(edgestack[i].number1 ,edgestack[i].number2 ,edge.number1 ,number2);
if ((((edgestack[i].number1!=edge.number1 )&&(edgestack[i].number2 !=edge.number2 ))
||((edgestack[i].number2 !=edge.number1 )&&(edgestack[i].number1 !=edge.number2 )))
||(((edgestack[i].number1 !=edge.number2 )&&(edgestack[i].number2 !=number2))
||((edgestack[i].number2 !=edge.number2 )&&(edgestack[i].number1 !=number2))))
Intersect2=IsIntersect(edgestack[i].number1 ,edgestack[i].number2 ,edge.number2 ,number2);
i++;
}
length=(mypoint[edge.number1 ].x -mypoint[edge.number2 ].x )*(mypoint[edge.number1 ].x -mypoint[edge.number2 ].x )+
(mypoint[edge.number1 ].y -mypoint[edge.number2 ].y )*(mypoint[edge.number1 ].y -mypoint[edge.number2 ].y);
double length1,length2;
length1=(mypoint[edge.number1 ].x -mypoint[number2].x )*(mypoint[edge.number1 ].y -mypoint[number2].y )+
(mypoint[edge.number1].y -mypoint[number2].y )*(mypoint[edge.number1 ].y -mypoint[number2].y );
length2=(mypoint[edge.number2 ].x -mypoint[number2].x )*(mypoint[edge.number2 ].y -mypoint[number2].y )+
(mypoint[edge.number2].y -mypoint[number2].y )*(mypoint[edge.number2 ].y -mypoint[number2].y );
/* if ((length1>length2)&&(length1>2*length/3.))
return 0;
if ((length2>length1)&&(length2>2*length/3.))
return 0; */
if ((Intersect1==1)||(Intersect2==1))
return 0;//点不是可见的
else
return 1;
}
else
return 0;//没有任何点可见
}
int CTrianglulationView::PointRelToEdge(Edge edge)
{
int i;
for (i=0;i<triangularstacknum;i++)
{
if ((triangular[i].number1 ==edge.number1 )||(triangular[i].number2 ==edge.number1 )||(triangular [i].number3 ==edge.number1 ))
{
if ((triangular[i].number1 ==edge.number2 )||(triangular[i].number2 ==edge.number2 )||(triangular [i].number3 ==edge.number2 ))
if ((triangular[i].number1 !=edge.number1 )&&(triangular[i].number1 !=edge.number2 ))
{
if (RelPoint1==-1)
RelPoint1=triangular[i].number1 ;
else
RelPoint2=triangular[i].number1 ;
}
else
if ((triangular[i].number2 !=edge.number1 )&&(triangular[i].number2 !=edge.number2 ))
{
if (RelPoint1==-1)
RelPoint1=triangular[i].number2 ;
else
RelPoint2=triangular[i].number2 ;
}
else
{
if (RelPoint1==-1)
RelPoint1=triangular[i].number3 ;
else
RelPoint2=triangular[i].number3 ;
}
}
}
if ((RelPoint1!=-1)&&(RelPoint2!=-1))
{
return -1;//边已经有两个三角形与之相关
}
if ((RelPoint1!=-1)&&(RelPoint2==-1))
{
return RelPoint1;//与之相关的顶点
}
if ((RelPoint2!=-1)&&(RelPoint1==-1))
{
return RelPoint2;//与之相关的顶点
}
if ((RelPoint1==-1)&&(RelPoint2==-1))
{
return -2;//没有顶点与之相关
}
}
double CTrianglulationView::threepoint(int number1, int number2, int number3)
{
//calculate the cos of the three points(number1 is the common point)
double cos;
double l1,l2,m1,m2,n1,n2;
l1=mypoint[number1].y -mypoint[number2].y;
l2=mypoint[number1].y -mypoint[number3].y;
m1=mypoint[number1].x -mypoint[number2].x;
m2=mypoint[number1].x -mypoint[number3].x;
n1=mypoint[number2].x *mypoint[number1].y -mypoint[number1].x *mypoint[number2].y ;
n2=mypoint[number3].x *mypoint[number1].y -mypoint[number1].x *mypoint[number3].y ;
cos =(l1*l2+m1*m2+n1*n2)/(sqrt(l1*l1+m1*m1+n1*n1)*sqrt(l2*l2+m2*m2+n2*n2));
cos=acos(cos);
return cos;
}
bool CTrianglulationView::IsIntersect(int number1, int number2, int number3, int number4)
{
double d1,d2,x,y,f;
if ((number1==number3)||(number1==number4)||(number2==number3)||(number2==number4))
return 0;
if ((number1==-1)||(number2==-1)||(number3==-1)||(number4==-1))
return 0;
d1=((double)mypoint[number4].y -mypoint[number3].y )/(mypoint[number4].x -mypoint[number3].x )-
((double)mypoint[number2].y -mypoint[number1].y )/(mypoint[number2].x -mypoint[number1].x );
d2=((double)mypoint[number2].x *mypoint[number1].y -mypoint[number2].y *mypoint[number1].x )/(mypoint[number2].x -mypoint[number1].x)-
((double)mypoint[number4].x *mypoint[number3].y -mypoint[number3].x *mypoint[number4].y )/(mypoint[number4].x -mypoint[number3].x );
x=(d2/d1);
if (mypoint[number1].x <mypoint[number2].x )
{
if (mypoint[number3].x<mypoint[number4].x)
{
if ((x>=mypoint[number1].x )&&(x<=mypoint[number2].x )&&(x>=mypoint[number3].x )&&(x<=mypoint[number4].x))
return 1;//不相交
else
return 0;//相交
}
else
{
if (mypoint[number3].x >mypoint[number4].x )
if ((x>=mypoint[number1].x )&&(x<=mypoint[number2].x )&&(x>=mypoint[number4].x )&&(x<=mypoint[number3].x ))
return 1;//不相交
else
return 0;//相交
}
}
else
{
if (mypoint[number3].x<mypoint[number4].x )
{
if ((x>=mypoint[number2].x )&&(x<=mypoint[number1].x )&&(x>=mypoint[number3].x )&&(x<=mypoint[number4].x))
return 1;//不相交
else
return 0;//相交
}
else
{
if (mypoint[number3].x >mypoint[number4].x )
if ((x<=mypoint[number1].x )&&(x>=mypoint[number2].x )&&(x>=mypoint[number4].x )&&(x<=mypoint[number3].x ))
return 1;//不相交
else
return 0;//相交
}
}
}
bool CTrianglulationView::PointToLine(int number1, int number2, int number3)
{
double d1,d2;
d1=sqrt((mypoint[number1].x -mypoint[number2].x )*(mypoint[number1].x -mypoint[number2].x )
-(mypoint[number2].y-mypoint[number1].y )*(mypoint[number2].y -mypoint[number1].y ));
// d2=
return 1;
}
void CTrianglulationView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
mypoint[buttonpointnum].x =point.x ;
mypoint[buttonpointnum].y =point.y ;
CDC *pDC=GetDC();
pDC->SetPixel(mypoint[buttonpointnum].x ,mypoint[buttonpointnum].y ,1);
CString mystr1,mystr2,mystr;
mystr1.Format ("%d",mypoint[buttonpointnum].x );
mystr2.Format ("%d",mypoint[buttonpointnum].y );
mystr=" "+mystr1+","+mystr2;
// pDC->TextOut (mypoint[buttonpointnum].x,mypoint[buttonpointnum].y,mystr);
buttonpointnum++;
// triangulate();
// CView::OnLButtonDown(nFlags, point);
}
void CTrianglulationView::OnTriangulate()
{
// TODO: Add your command handler code here
triangulate();
}
double CTrianglulationView::AR(int number1, int number2, int number3)
{
double d;
d=abs((mypoint[number1].x-mypoint[number2].x )*mypoint[number3].y +(mypoint[number2].y -mypoint[number1].y )*mypoint[number3].x
+(mypoint[number2].x *mypoint[number1].y -mypoint[number2].y *mypoint[number1].x ))/((mypoint[number1].x -mypoint[number2].x )*
(mypoint[number1].x -mypoint[number2].x )+(mypoint[number1].y -mypoint[number2].y )*(mypoint[number1].y -mypoint[number2].y ));
return d;
}
void CTrianglulationView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/* CDC *pDC=GetDC();
CString mystr1,mystr2,mystr;
mystr1.Format ("%d",point.x);
mystr2.Format ("%d",point.y );
mystr=" "+mystr1+","+mystr2;
pDC->TextOut(point.x ,point.y ,mystr);*/
CView::OnMouseMove(nFlags, point);
}
double CTrianglulationView::abc(double number1, double number2)
{
double m;
m=number1-number2;
if (m>=0.)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -