已知一条Bezier曲线的控制点,我想用自己的图片(一个复杂的花样)来替换原有的曲线样式,应该如何操作.
不知道在GDI+中是否有现成的方式,如果没有,是否有方法求Bezier曲线的一个样对小密度的轨迹点集还有一个问题,就是给定两个多边形的顺序点集Point[]p,Point[]q,如何能得到他们的交集多边形(或多边形们)的顺序点集
不知道在GDI+中是否有现成的方式,如果没有,是否有方法求Bezier曲线的一个样对小密度的轨迹点集还有一个问题,就是给定两个多边形的顺序点集Point[]p,Point[]q,如何能得到他们的交集多边形(或多边形们)的顺序点集
两个多边形的顺序点集Point[]p,Point[]q,如何能得到他们的交集多边形(或多边形们)的顺序点集
这个还没有搞定。
曲线样式替换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中的点是不是在相交区域中可以得到相交多边形的各个点。
至于如何实现这些点的排序,我还没有什么好的方法。至少这些点可以用上面的方法轻松找到。