已知CPiont p1,p2,p3 三点坐标,画出过三点一条弧线算法

解决方案 »

  1.   

    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词法分析
      

  2.   

    以前写的一段程序,可以将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;
    }