已知一条Bezier曲线的控制点,我想用自己的图片(一个复杂的花样)来替换原有的曲线样式,应该如何操作.
不知道在GDI+中是否有现成的方式,如果没有,是否有方法求Bezier曲线的一个样对小密度的轨迹点集还有一个问题,就是给定两个多边形的顺序点集Point[]p,Point[]q,如何能得到他们的交集多边形(或多边形们)的顺序点集

解决方案 »

  1.   

    Bezier曲线的已经搞定了。
    两个多边形的顺序点集Point[]p,Point[]q,如何能得到他们的交集多边形(或多边形们)的顺序点集 
    这个还没有搞定。
      

  2.   

    不好,直接使用2D矢量函数库就可以了(如OpenVG/gingkoVG),GDI无法消除曲线的锯齿,GDI+道可以考虑http://download.csdn.net/source/577334第18页有有关曲线填充的问题;
      

  3.   

    你的第一个问题虽然解决了我还是回答一下,呵呵。
    曲线样式替换GDI+中有texturebrush可以实现,估计你也实现了。
    通过曲线你肯定可以建立GraphicsPath,通过GraphicsPath可以得到PathData,里面是曲线较为密的点(其实是主要点)。
    要想将曲线的点再加密,我有一个方法,你可以将GraphicsPath使用Widen方法宽展一下,宽展的时候使用虚线Pen。
    然后再取PathData,在PathData中每四个点取X坐标和Y坐标的均值就可以得到均匀的加密的曲线点了。
    代码:
    Pen wdPen(Color(0, 0, 0, 0),1);
    REAL DV[2] = {REAL(0.1),REAL(0.1)};
    wdPen.SetDashPattern(DV, 2);
    //------------------------------------------------------------
    OrPath->Widen(&wdPen);
    //------------------------------------------------------------
    PathData bzDT;
    OrPath->GetPathData(&bzDT); CArray<PointF,PointF> ULt; for(INT ibz=0;ibz<bzDT.Count;ibz++)
    {
    if((ibz % 4)==0)
    {
    PointF Ucen;
    PointF Dcen; Ucen.X=(bzDT.Points[ibz].X+bzDT.Points[ibz+1].X+bzDT.Points[ibz+2].X+bzDT.Points[ibz+3].X)/4;
    Ucen.Y=(bzDT.Points[ibz].Y+bzDT.Points[ibz+1].Y+bzDT.Points[ibz+2].Y+bzDT.Points[ibz+3].Y) /4; ULt.Add(Ucen);
    }
    }
    //----------------------------------------------------------------
    ULt就是曲线上密集的点集合。关于第二个问题:
    通过你所说的两个点集Point[]p,Point[]q肯定可以建立两个路径和两个区域。
    首先通过区域运算intersect找到相交区域;通过路径的Add方法建立一个联合路径;
    然后取得联合路径的dePathData(这个时候联合路径的PathData应该包含了两个路径的交点了)。
    通过判断PathData中的点是不是在相交区域中可以得到相交多边形的各个点。
    至于如何实现这些点的排序,我还没有什么好的方法。至少这些点可以用上面的方法轻松找到。