求教图形图像处理高手:如何实现画图软件中对物体的选择??

tobato 2001-03-24 03:44:00
画图软件中的选择是很重要的功能,比如 对直线的选择,点击直线上的
任意一点都可以选中那条直线。能谈一谈是怎么实现的吗?如果直线加宽过
又怎么办?
还有 矩形,区域 等的选择。
...全文
772 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
musicdancer 2001-03-29
  • 打赏
  • 举报
回复
因为是矢量图,所以,很容易得到图形的控制点.
我觉得你还是去做做,怎么会不敢想?

tobato 2001-03-28
  • 打赏
  • 举报
回复
to lpvoid ok ,我试一下,但是区域的生成只能用链表来管了,画一个圆生成一个圆的区域 然后
再生成,再生成, 到时遍历链表来找? 就和rocks_lee说的差不多。
to all 我看firework 就有这样的功能, 不过他的图是用矢量图来做的,是怎么实现的呢?
还有chinaha 说的层的实现,我觉得挺难的,photoshop里的层都是透明的,我怎么做透明的
层呢? 如果画一条线就生成一个层? 哪.....没法往下想了






lpvoid 2001-03-28
  • 打赏
  • 举报
回复
陈建春的《VC++开发GIS》不怎么样,讲得很初级。GIS我也干过,图元编辑我也做过,确实很麻烦。可以试一下PtInRegion、 PtInRect两个API,不过很多东西还是要自己做。
踏踏实实一点一点的做吧
musicdancer 2001-03-28
  • 打赏
  • 举报
回复
我认为,如果你是开发图像软件,像你这样得点取要求,是不是高了点?
无论如何,要判断是否点取一个物体,都要判断点是否在你定义的区域里面,其实,也就是基本的思路.你需要的是怎么定义这个区域.
musicdancer 2001-03-28
  • 打赏
  • 举报
回复
我觉得再繁的图形都是由基本图元素组成,如果每个图元素有自己的控制点,则所有的图元素控制点组成你需要的控制点,由控制点控制得出范围,形成Region,这样,你就可以实现你的目的.不过我并不推荐这样做,图层应是好办法,也容易实现.
rockswang 2001-03-27
  • 打赏
  • 举报
回复
重要的是要用图元的的机制,即每个图元是一个对象,它们从同一个基类(GlyphBase)继承而来,在基类里就应该有GlyphBase::isPointIn(int x, int y)这样的函数,各个子类分别实现这个虚函数,对于不同的图元自然有不同的方法。用基类建立一个指针链表或数组,每次需要判断拾取时,用鼠标的当前坐标对所有图元遍历一遍,找到一个break即可。
vcd 2001-03-27
  • 打赏
  • 举报
回复
不知道有没有朋友用过组态软件,那里面就用到了很多这种作图的功能,而且在动画连接上
有更多复杂的开发工作,不知道这里有没有这方面的专家
tobato 2001-03-27
  • 打赏
  • 举报
回复
to apier 你做的东西能发给我吗? towyf@ynmail.com
APIer 2001-03-26
  • 打赏
  • 举报
回复
我的做法是定义点,直线,椭圆,文字等对象,然后通过鼠标的消息得到这个对象,进行修改设置,以前做过一个简单的东西,只能做点,直线,椭圆,文字,可以拷贝,放缩,并修改所选的对象属性:)
killwd 2001-03-26
  • 打赏
  • 举报
回复
关注。
lbqsv 2001-03-26
  • 打赏
  • 举报
回复
请参考PtInRegion PtInRect这两个API,在msdn
chinaha 2001-03-26
  • 打赏
  • 举报
回复
我有一本清华大学出版的VJ++图形图像处理,不错,虽是java语言,也可参考。你也可以找一找这本书,很不错。
chinaha 2001-03-26
  • 打赏
  • 举报
回复
我也正在开发这样的软件,我用的是用层来实现,对于矩形,是用矩形的四个边来判断,是否鼠标在其中,另个还有一些技巧,如果有意,和我联系,互相交流。 chinaha@371.net
patient 2001-03-26
  • 打赏
  • 举报
回复
确实很繁,尤其重叠,选取,变形,转换什么的
musicdancer 2001-03-25
  • 打赏
  • 举报
回复
BOOL CLine::IsPointSelected(CPoint &point)
{
double d0 = sqrt((m_stPnt.x-m_edPnt.x)*(m_stPnt.x-m_edPnt.x)
+ (m_stPnt.y-m_edPnt.y)*(m_stPnt.y-m_edPnt.y)) ;

double d=fabs((m_edPnt.x-m_stPnt.x)*(point.y-m_stPnt.y)
+(m_stPnt.y-m_edPnt.y)*(point.x-m_stPnt.x))/d0;

double c=(point.x-m_stPnt.x)*(m_edPnt.x-point.x)+(point.y-m_stPnt.y)*(m_edPnt.y-point.y);

return (d<=3&&c>=0);//3为点取精度

}
其实这个问题只是一个数学问题,点到直线的距离.
tobato 2001-03-25
  • 打赏
  • 举报
回复
to lxgcn 好吧, 我也看看 GDI我写成GUI了,大家都看的懂吧?
to musicdancer(饭盆)  点到直线的距离?我的直线不是单纯的一条线,是由圆形,矩形,星形等 依据直线的中点用N个填出来的,
程序思路如下:
输入CPoint
以CPoint 为中点画 圆形(矩形..) 还有随机参数控制圆形的大小,每次画出来的是不一样大得圆形(矩形..)
这样画出来的线, 所以可能不一定是直线,还可能是曲线,变化多端 ^_^ (所以很烦)
有好多条, 要点任意一个点判断是否在线上。 要怎么写hittest()?
不是用点到直线的距离可以判断的出来的 (最近这个问题让我很烦..很烦...)
lxgcn 2001-03-25
  • 打赏
  • 举报
回复
华储网上书店有卖
网址:http://www.huachu.com.cn/asp/book/brow.asp?lbbh=B01019222
good luck!
lxgcn 2001-03-25
  • 打赏
  • 举报
回复
象你推荐一本书吧
《VC++开发GIS》
陈建春,31岁,北方交通大学教师、博士。长期从事工程CAD系统、MIS及GIS的研究和开发工作。组织开发了《新建铁路施工指挥系统》、《铁路GIS系统》、《通用多媒体GIS系统》、《秦沈客运专线信息管理系统》等实用软件系统。近年在软件开发之余,从事VC++方面的计算机书籍的编写工作,所编写的图书都是由具体的开发实例结合开发经验和实际代码为基础,从程序设计思想、开发思路以及具体开发技术等方面进行讲述,可大大地提高计算机软件设计的综合能力。

肯定能满足你的要求,我正在作毕业设计,就用这本书,你看看吧,大家也好一起讨论。
kkksoft 2001-03-25
  • 打赏
  • 举报
回复
画图时用缓存储器。
画面记录用数组!
选取后用缓存辨别!
保正速度,牺牲内存!
classfactory 2001-03-25
  • 打赏
  • 举报
回复

class CGraphObject
{
protected:
int m_izOrder; // 0, 1, 2,....
RECT m_rectBounding;

public:
virtual BOOL HitTest(const CPoint& point)=0; // 子类必须重载以判断是否选
// 中。另外,如果有多个对象都满足条件,比较它们的m_izOrder置
};
加载更多回复(9)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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