求画出过三点一条弧线算法 已知CPiont p1,p2,p3 三点坐标,画出过三点一条弧线算法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int32 CArc::Create(PNT2D *pPnt1, PNT2D *pPnt2, PNT2D *pPnt3, int32 bCCW, int32 bOrdinal){ PNT2D n1, n2, o1, o2, v1, v2, v3, p1, p2, p3; real64 t1, t2, temp, theta1, theta2 ,theta3; p1 = *pPnt1; p2 = *pPnt2; p3 = *pPnt3; n1 = p2-p1; temp = n1.x; n1.x = -n1.y; n1.y = temp; n2 = p3-p2; temp = n2.x; n2.x = -n2.y; n2.y = temp; if(fabs(n1.x*n2.y - n2.x*n1.y) < FLOATLIMIT || fabs(n1.x*n2.y - n2.x*n1.y) < FLOATLIMIT) return FALSE; t1 = -0.5*((p3.y-p1.y)*n2.x - (p3.x-p1.x)*n2.y) / (n1.x*n2.y - n2.x*n1.y); t2 = -0.5*((p1.x-p3.x)*n1.y - (p1.y-p3.y)*n1.x) / (n1.x*n2.y - n2.x*n1.y)/2; o1 = (p1+p2)/2 + n1*t1; o2 = (p2+p3)/2 + n2*t2; v1 = p1-o1; v2 = p2-o1; v3 = p3-o1; theta1 = Angle(v1); theta2 = Angle(v2); theta3 = Angle(v3); m_o = o1; m_fRadius = Module(*pPnt1-o1); if(m_fRadius<EPSILON) return FALSE; m_bCCW = 1; if(bOrdinal) { while(theta1>theta3) theta1 -= 2*PI; while(theta2>theta3) theta2 -= 2*PI; if(theta1<theta2 && theta2<theta3) { m_angle1 = Angle(v1); m_angle2 = Angle(v3); } else { m_angle1 = Angle(v3); m_angle2 = Angle(v1); } } else { while(theta1>theta2) theta1 -= 2*PI; while(theta3>theta2) theta3 -= 2*PI; if(theta1<theta3 && theta3<theta2) { m_angle1 = Angle(v1); m_angle2 = Angle(v2); } else { m_angle1 = Angle(v2); m_angle2 = Angle(v1); } } if(!bCCW) Reverse(); return TRUE;}============================================================================提问题时标题要简明扼要地说明问题内容,切忌使用"急","求救"之类不能说明问题的标题http://alphasun.betajin.com/ 遇到问题可以给我发消息,给我发信息时请附带原帖地址DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析 以前写的一段程序,可以将pn所指向的n个点按抛物线连起来,bClose为true时可以首尾相连。n为3时就是你要的BOOL CGraphDC::_Parabola(const LPPOINT pn,const int &n,const BOOL &bClose){ if (n<3) return FALSE; LPPOINT p=pn; int x,y,ox,oy,i,k; double t1,t2,t3,t,a,b,c,d; k=0; while (++p<pn+n) { x=p->x-(p-1)->x; y=p->y-(p-1)->y; i=int(sqrt((double)x*x+y*y)+0.5); if (k<i) k=i; } p=pn; if (bClose) { x=p->x-(p+n-1)->x; y=p->y-(p+n-1)->y; i=int(sqrt((double)x*x+y*y)+0.5); if (k<i) k=i; } x=ox=p->x; y=oy=p->y; if (k==0) return _Line(ox,oy,x,y,FALSE); t=0.5/k; t1=t; t2=t1*t1; t3=t2*t1; a=4*(t2-t3)-t1; b=1-10*t2+12*t3; c=t1+8*t2-12*t3; d=4*t3-2*t2; if (bClose) { x=int(a*((p+n-1)->x)+b*(p->x)+c*((p+1)->x)+d*((p+2)->x)); y=int(a*((p+n-1)->y)+b*(p->y)+c*((p+1)->y)+d*((p+2)->y)); } else { x=int((a+b)*(p->x)+c*((p+1)->x)+d*((p+2)->x)); y=int((a+b)*(p->y)+c*((p+1)->y)+d*((p+2)->y)); } if (!_Line(ox,oy,x,y,FALSE)) return FALSE; ox=x,oy=y; for (i=2;i<k;i++) { t1+=t; t2=t1*t1; t3=t2*t1; a=4*(t2-t3)-t1; b=1-10*t2+12*t3; c=t1+8*t2-12*t3; d=4*t3-2*t2; if (bClose) { x=int(a*((p+n-1)->x)+b*(p->x)+c*((p+1)->x)+d*((p+2)->x)); y=int(a*((p+n-1)->y)+b*(p->y)+c*((p+1)->y)+d*((p+2)->y)); } else { x=int((a+b)*(p->x)+c*((p+1)->x)+d*((p+2)->x)); y=int((a+b)*(p->y)+c*((p+1)->y)+d*((p+2)->y)); } if (x==ox && y==oy) continue; if (!_Line(ox,oy,x,y,TRUE)) return FALSE; ox=x,oy=y; } x=(p+1)->x; y=(p+1)->y; if (x!=ox||y!=oy) { if (!_Line(ox,oy,x,y,TRUE)) return FALSE; ox=x,oy=y; } while (p<pn+n-3) { t1=0.0; for (i=1;i<k;i++) { t1+=t; t2=t1*t1; t3=t2*t1; a=4*(t2-t3)-t1; b=1-10*t2+12*t3; c=t1+8*t2-12*t3; d=4*t3-2*t2; x=int(a*(p->x)+b*((p+1)->x)+c*((p+2)->x)+d*((p+3)->x)); y=int(a*(p->y)+b*((p+1)->y)+c*((p+2)->y)+d*((p+3)->y)); if (x==ox && y==oy) continue; if (!_Line(ox,oy,x,y,TRUE)) return FALSE; ox=x,oy=y; } x=(p+2)->x; y=(p+2)->y; p++; if (x==ox&&y==oy) continue; if (!_Line(ox,oy,x,y,TRUE)) return FALSE; ox=x,oy=y; } t1=0.0; for (i=1;i<k;i++) { t1+=t; t2=t1*t1; t3=t2*t1; a=4*(t2-t3)-t1; b=1-10*t2+12*t3; c=t1+8*t2-12*t3; d=4*t3-2*t2; if (bClose) { x=int(a*(p->x)+b*((p+1)->x)+c*((p+2)->x)+d*(pn->x)); y=int(a*(p->y)+b*((p+1)->y)+c*((p+2)->y)+d*(pn->y)); } else { x=int(a*(p->x)+b*((p+1)->x)+(c+d)*((p+2)->x)); y=int(a*(p->y)+b*((p+1)->y)+(c+d)*((p+2)->y)); } if (x==ox&&y==oy) continue; if (!_Line(ox,oy,x,y,TRUE)) return FALSE; ox=x,oy=y; } x=(p+2)->x; y=(p+2)->y; if (x!=ox||y!=oy) { if (!_Line(ox,oy,x,y,TRUE)) return FALSE; ox=x,oy=y; } if (bClose) { p++; t1=0.0; for (i=1;i<k;i++) { t1+=t; t2=t1*t1; t3=t2*t1; a=4*(t2-t3)-t1; b=1-10*t2+12*t3; c=t1+8*t2-12*t3; d=4*t3-2*t2; x=int(a*(p->x)+b*((p+1)->x)+c*(pn->x)+d*((pn+1)->x)); y=int(a*(p->y)+b*((p+1)->y)+c*(pn->y)+d*((pn+1)->y)); if (x==ox&&y==oy) continue; if (!_Line(ox,oy,x,y,TRUE)) return FALSE; ox=x,oy=y; } x=pn->x; y=pn->y; if (x!=ox||y!=oy) if (!_Line(ox,oy,x,y,TRUE)) return FALSE; } if (m_bUpdate) Flush( ); return TRUE;} SendMessage发送的消息//在消息处理函数里弹出提示框会报错是什么原因 如何在工具栏上挂多个组合框, VC + SQL 在界面中,怎样让表中的主码(编号,vchar)自动加一 读取位图结构的问题,大家帮帮我,很急 急 急 (119)求:教学课堂教学质量测评系统的开发流程 在文档视图结构中进行显示 MSDN部分链接打不开的问题 实时曲线中滚动是怎么实现的?回答即给分!!! 请教一下ADO的问题,帮忙了! 独行软件开发公司现招一批兼职员工 怎样把双精度类型转化为整型,不通过format转换(在线等待!!) 怎么把msdn和vc关联起来
{
PNT2D n1, n2, o1, o2, v1, v2, v3, p1, p2, p3;
real64 t1, t2, temp, theta1, theta2 ,theta3; p1 = *pPnt1;
p2 = *pPnt2;
p3 = *pPnt3; n1 = p2-p1;
temp = n1.x;
n1.x = -n1.y;
n1.y = temp; n2 = p3-p2;
temp = n2.x;
n2.x = -n2.y;
n2.y = temp; if(fabs(n1.x*n2.y - n2.x*n1.y) < FLOATLIMIT
|| fabs(n1.x*n2.y - n2.x*n1.y) < FLOATLIMIT)
return FALSE; t1 = -0.5*((p3.y-p1.y)*n2.x - (p3.x-p1.x)*n2.y) /
(n1.x*n2.y - n2.x*n1.y);
t2 = -0.5*((p1.x-p3.x)*n1.y - (p1.y-p3.y)*n1.x) /
(n1.x*n2.y - n2.x*n1.y)/2; o1 = (p1+p2)/2 + n1*t1;
o2 = (p2+p3)/2 + n2*t2; v1 = p1-o1;
v2 = p2-o1;
v3 = p3-o1;
theta1 = Angle(v1);
theta2 = Angle(v2);
theta3 = Angle(v3); m_o = o1;
m_fRadius = Module(*pPnt1-o1);
if(m_fRadius<EPSILON)
return FALSE;
m_bCCW = 1;
if(bOrdinal)
{
while(theta1>theta3)
theta1 -= 2*PI;
while(theta2>theta3)
theta2 -= 2*PI; if(theta1<theta2 && theta2<theta3)
{
m_angle1 = Angle(v1);
m_angle2 = Angle(v3);
}
else
{
m_angle1 = Angle(v3);
m_angle2 = Angle(v1);
}
}
else
{
while(theta1>theta2)
theta1 -= 2*PI;
while(theta3>theta2)
theta3 -= 2*PI; if(theta1<theta3 && theta3<theta2)
{
m_angle1 = Angle(v1);
m_angle2 = Angle(v2);
}
else
{
m_angle1 = Angle(v2);
m_angle2 = Angle(v1);
}
} if(!bCCW)
Reverse(); return TRUE;
}
============================================================================
提问题时标题要简明扼要地说明问题内容,切忌使用"急","求救"之类不能说明问题的标题
http://alphasun.betajin.com/ 遇到问题可以给我发消息,给我发信息时请附带原帖地址
DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
BOOL CGraphDC::_Parabola(const LPPOINT pn,const int &n,const BOOL &bClose)
{
if (n<3) return FALSE;
LPPOINT p=pn;
int x,y,ox,oy,i,k;
double t1,t2,t3,t,a,b,c,d;
k=0;
while (++p<pn+n)
{
x=p->x-(p-1)->x;
y=p->y-(p-1)->y;
i=int(sqrt((double)x*x+y*y)+0.5);
if (k<i) k=i;
}
p=pn;
if (bClose)
{
x=p->x-(p+n-1)->x;
y=p->y-(p+n-1)->y;
i=int(sqrt((double)x*x+y*y)+0.5);
if (k<i) k=i;
}
x=ox=p->x;
y=oy=p->y;
if (k==0) return _Line(ox,oy,x,y,FALSE);
t=0.5/k;
t1=t;
t2=t1*t1;
t3=t2*t1;
a=4*(t2-t3)-t1;
b=1-10*t2+12*t3;
c=t1+8*t2-12*t3;
d=4*t3-2*t2;
if (bClose)
{
x=int(a*((p+n-1)->x)+b*(p->x)+c*((p+1)->x)+d*((p+2)->x));
y=int(a*((p+n-1)->y)+b*(p->y)+c*((p+1)->y)+d*((p+2)->y));
}
else
{
x=int((a+b)*(p->x)+c*((p+1)->x)+d*((p+2)->x));
y=int((a+b)*(p->y)+c*((p+1)->y)+d*((p+2)->y)); }
if (!_Line(ox,oy,x,y,FALSE)) return FALSE;
ox=x,oy=y;
for (i=2;i<k;i++)
{
t1+=t;
t2=t1*t1;
t3=t2*t1;
a=4*(t2-t3)-t1;
b=1-10*t2+12*t3;
c=t1+8*t2-12*t3;
d=4*t3-2*t2;
if (bClose)
{
x=int(a*((p+n-1)->x)+b*(p->x)+c*((p+1)->x)+d*((p+2)->x));
y=int(a*((p+n-1)->y)+b*(p->y)+c*((p+1)->y)+d*((p+2)->y));
}
else
{
x=int((a+b)*(p->x)+c*((p+1)->x)+d*((p+2)->x));
y=int((a+b)*(p->y)+c*((p+1)->y)+d*((p+2)->y)); }
if (x==ox && y==oy) continue;
if (!_Line(ox,oy,x,y,TRUE)) return FALSE;
ox=x,oy=y;
}
x=(p+1)->x;
y=(p+1)->y;
if (x!=ox||y!=oy)
{
if (!_Line(ox,oy,x,y,TRUE)) return FALSE;
ox=x,oy=y;
}
while (p<pn+n-3)
{
t1=0.0;
for (i=1;i<k;i++)
{
t1+=t;
t2=t1*t1;
t3=t2*t1;
a=4*(t2-t3)-t1;
b=1-10*t2+12*t3;
c=t1+8*t2-12*t3;
d=4*t3-2*t2;
x=int(a*(p->x)+b*((p+1)->x)+c*((p+2)->x)+d*((p+3)->x));
y=int(a*(p->y)+b*((p+1)->y)+c*((p+2)->y)+d*((p+3)->y));
if (x==ox && y==oy) continue;
if (!_Line(ox,oy,x,y,TRUE)) return FALSE;
ox=x,oy=y;
}
x=(p+2)->x;
y=(p+2)->y;
p++;
if (x==ox&&y==oy) continue;
if (!_Line(ox,oy,x,y,TRUE)) return FALSE;
ox=x,oy=y;
}
t1=0.0;
for (i=1;i<k;i++)
{
t1+=t;
t2=t1*t1;
t3=t2*t1;
a=4*(t2-t3)-t1;
b=1-10*t2+12*t3;
c=t1+8*t2-12*t3;
d=4*t3-2*t2;
if (bClose)
{
x=int(a*(p->x)+b*((p+1)->x)+c*((p+2)->x)+d*(pn->x));
y=int(a*(p->y)+b*((p+1)->y)+c*((p+2)->y)+d*(pn->y));
}
else
{
x=int(a*(p->x)+b*((p+1)->x)+(c+d)*((p+2)->x));
y=int(a*(p->y)+b*((p+1)->y)+(c+d)*((p+2)->y));
}
if (x==ox&&y==oy) continue;
if (!_Line(ox,oy,x,y,TRUE)) return FALSE;
ox=x,oy=y;
}
x=(p+2)->x;
y=(p+2)->y;
if (x!=ox||y!=oy)
{
if (!_Line(ox,oy,x,y,TRUE)) return FALSE;
ox=x,oy=y;
}
if (bClose)
{
p++;
t1=0.0;
for (i=1;i<k;i++)
{
t1+=t;
t2=t1*t1;
t3=t2*t1;
a=4*(t2-t3)-t1;
b=1-10*t2+12*t3;
c=t1+8*t2-12*t3;
d=4*t3-2*t2;
x=int(a*(p->x)+b*((p+1)->x)+c*(pn->x)+d*((pn+1)->x));
y=int(a*(p->y)+b*((p+1)->y)+c*(pn->y)+d*((pn+1)->y));
if (x==ox&&y==oy) continue;
if (!_Line(ox,oy,x,y,TRUE)) return FALSE;
ox=x,oy=y;
}
x=pn->x;
y=pn->y;
if (x!=ox||y!=oy)
if (!_Line(ox,oy,x,y,TRUE)) return FALSE;
}
if (m_bUpdate) Flush( );
return TRUE;
}