如何用vc++/c#实现图形线段的偏移

licq95 2008-09-11 05:24:34
有如下坐标围成的多边形(墙体中轴线)
10,10
510,10
510,610
310,610
310,810
10,810
点击多边形任一点选定本多边形,然后如果在多边形外点击任一点实现把多边形各边向外偏移8像素组成新的多变形,
如果在多边形内点击任一点实现把多边形各边向内偏移8像素组成新的多变形,

效果类似CAD的偏移命令,
具体思路和实现代码怎样实现?
...全文
520 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2008-09-19
  • 打赏
  • 举报
回复
GOOGLE 等距线
mxm324 2008-09-19
  • 打赏
  • 举报
回复
o(∩_∩)o....这个东西我做过..
比较难..主要就是根据中间的线求它的两条平行线..
具体算法可能不方便告之..给个提示..我做得时候是用角平分线来做...
Tinary3v0 2008-09-19
  • 打赏
  • 举报
回复
郁闷 图片怎么没有出来 重新发一下:
Tinary3v0 2008-09-19
  • 打赏
  • 举报
回复
[http://p.blog.csdn.net/images/p_blog_csdn_net/Tinary3v0/EntryImages/20080919/KNF.jpg][/img]
如果我理解的没有问题的话,楼主的问题是不是要求上图中用圆标记出来的各个点啊?

如果是这样话:下面的代码既是该图形绘制代码

GraphicsPath pH; //定义一个gdi+路径。
PointF NmlPT[ 6 ];
NmlPT[ 0 ] = PointF( 110, 110 ); NmlPT[ 1 ] = PointF( 310, 110 ); NmlPT[ 2 ] = PointF( 310, 310 );
NmlPT[ 3 ] = PointF( 410, 410 ); NmlPT[ 4 ] = PointF( 410,510 ); NmlPT[ 5 ] = PointF( 110, 610 );
pH.AddPolygon( NmlPT, 6 ); //路径中添加一个多边形。

Pen pn(Color(255,0,0,0),1); //定义原路径使用的画笔。颜色为黑色,宽度为1。
gra->DrawPath(&pn,&pH); //绘制原路径。

Pen wdpn( Color(0,0,0,0),16 ); //建立一个扩展画笔,画笔的宽度为向内或者向外宽展距离的两倍,楼主说的是8,这里用的既是16了。
pH.Widen(&wdpn); //用这个画笔扩充路径。

pH.Outline(); //取得路径的轮廓,这一步是必须的。
pn.SetColor(Color(255,255,0,0));//用红色画笔绘制扩充后的路径。
gra->DrawPath(&pn,&pH);

PathData pd; //建立一个PathData变量
pH.GetPathData(&pd); //取得扩充后路径的PathData,PathData中存储了路径上所有的关键点

//下面我仅仅是简单的将路径内外的点分开了,其中PathData中前面6个点是原多边形外面的点,后面6个点是原多边形内部的六个点。
//注意这里的前六个点并不一定就是外面的点,需要根据路径的情况判断,具体的判断方法在这里就不说了。
for( INT id = 0; id< pd.Count/2; id ++ ) //用浅绿色绘制前六点。
{
Pen pm( Color( 255,0,255,255 ), 2 );
gra->DrawEllipse(&pm,pd.Points[id].X-3,pd.Points[id].Y-3,REAL(6),REAL(6) );
}

for( INT idx = pd.Count/2; idx< pd.Count; idx ++ ) //用蓝色绘制后六个点。
{
Pen pm( Color( 255,0,0,255 ), 2 );
gra->DrawEllipse(&pm,pd.Points[idx].X-3,pd.Points[idx].Y-3,REAL(6),REAL(6) );
}
菜牛 2008-09-12
  • 打赏
  • 举报
回复
计算出多边形的中心,然后依次把每个坐标移动一个比例就行了。
scq2099yt 2008-09-12
  • 打赏
  • 举报
回复
可以参考DrawCli,判断鼠标点击的点离多变形的距离,然后确定是放大还是缩小
licq95 2008-09-12
  • 打赏
  • 举报
回复
各点顺序首尾相连组成一个图形,非图像,VC调用三维软件(UG)的API等距离放大完成的。具体代码怎样?

deryker 2008-09-12
  • 打赏
  • 举报
回复
此题有点难度,顶一下!
binsir543 2008-09-12
  • 打赏
  • 举报
回复
定义一个于边界垂直的矢量,长度8像素,原点在边界上,移动
矢量顶点划过的轮廓即为新的多边形,由点击决定矢量方向
其实这跟膨胀腐蚀原理是一样的
binsir543 2008-09-12
  • 打赏
  • 举报
回复
恩恩,想错了,不是图像的缩放。
这个问题可以用形态学来解决。
如果是LZ给定的各点组成的多边形的话,也就是说边界是水平垂直线段的话,可以用边长为16像素的正方形进行膨胀和腐蚀操作
如果边界倾斜的话,需要用半径为8的圆形结构膨胀和腐蚀,不过角点需要处理。
binsir543 2008-09-11
  • 打赏
  • 举报
回复
多边形内部值为1,多边形外部值为0;寻找各边界建立能够包容多边形的最小矩形构成矩阵
利用插值和抽样完成矩阵的扩充和缩小
  • 打赏
  • 举报
回复
你说的不是很清楚,你的几组数据不能组成一个多边形。
不过,该问题是不是图形的等距离放大问题?如果是的话,我也做过,但是没有做出来(看似简单,越想越复杂),最后的解决办法是用VC调用三维软件(UG)的API等距离放大完成的。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧