不规则图元的选择,VC++
有两个问题请问各位高手1、在VC++中绘图,对于不规则的图形如何选择,例如直线,我可以定义一个链表,把每一条直线加入链表,鼠标按下时,通过点到直线的距离就可以判断选择,圆...
有两个问题请问各位高手
1、在 VC++中绘图,对于不规则的图形如何选择,例如直线,我可以定义一个链表,把每一条直线加入链表,鼠标按下时,通过点到直线的距离就可以判断选择,圆形,方形,椭圆等其他规则图形都可以。但是对于不规则图形例如我随意画了一条曲线,那怎么选择呢?
2、对于VC++中的绘图,例如我要绘制一条直线,此时画板上已经有红、蓝等多种颜色,我绘制时 当按下鼠标后我先记录该点,鼠标移动事件中我先通过
SetROP2(R2_NOTXORPEN),擦除上一次绘制的直线,然后在绘制现在的,但是这个有个不好处,就是我要绘制的直线是红色,但当这条直线通过红色区域时,红色区域中直线的颜色变为白色,虽然我可以在鼠标按键抬起事件中重绘这条直线,但感觉不好。例如系统自带的绘图软件就没有这种现象。请问各位高手你们是怎么做的,使直线通过任意颜色的区域,直线的颜色还是原来的色彩,而且还能把上一次的直线擦掉(就和绘制前一样)。
200分是最高分了,不能再加了,如果能加我愿意用1000分给与答谢!
我用过双缓冲方式,在内存中我建立了与绘图区相同的区域,在鼠标移动事件中先把内存中的区域bitblt到绘图DC上,然后在绘制,这样对于像素只有1的直线,等其他图形来说是可以的,但对于像素为2及其以上特别是绘制实心矩形时,矩形中心闪的厉害,我就想能否可以只bitblt没有被实心矩形等图元覆盖的区域。
谢谢大家的帮助,我的邮箱是zhguyi321@yahoo.com.cn,不过大家还是贴上来好,这样大家可以相互学习! 展开
1、在 VC++中绘图,对于不规则的图形如何选择,例如直线,我可以定义一个链表,把每一条直线加入链表,鼠标按下时,通过点到直线的距离就可以判断选择,圆形,方形,椭圆等其他规则图形都可以。但是对于不规则图形例如我随意画了一条曲线,那怎么选择呢?
2、对于VC++中的绘图,例如我要绘制一条直线,此时画板上已经有红、蓝等多种颜色,我绘制时 当按下鼠标后我先记录该点,鼠标移动事件中我先通过
SetROP2(R2_NOTXORPEN),擦除上一次绘制的直线,然后在绘制现在的,但是这个有个不好处,就是我要绘制的直线是红色,但当这条直线通过红色区域时,红色区域中直线的颜色变为白色,虽然我可以在鼠标按键抬起事件中重绘这条直线,但感觉不好。例如系统自带的绘图软件就没有这种现象。请问各位高手你们是怎么做的,使直线通过任意颜色的区域,直线的颜色还是原来的色彩,而且还能把上一次的直线擦掉(就和绘制前一样)。
200分是最高分了,不能再加了,如果能加我愿意用1000分给与答谢!
我用过双缓冲方式,在内存中我建立了与绘图区相同的区域,在鼠标移动事件中先把内存中的区域bitblt到绘图DC上,然后在绘制,这样对于像素只有1的直线,等其他图形来说是可以的,但对于像素为2及其以上特别是绘制实心矩形时,矩形中心闪的厉害,我就想能否可以只bitblt没有被实心矩形等图元覆盖的区域。
谢谢大家的帮助,我的邮箱是zhguyi321@yahoo.com.cn,不过大家还是贴上来好,这样大家可以相互学习! 展开
展开全部
楼主做的是矢量图?还是位图??
如果是矢量图,因为矢量图总是按照某种“算法”画出来的。计算点到图形的距离也有“算法”支持。如果是位图,对于你随意画的线条,如果你要保存这个线条,你一定会保存它一系列的点,那么你就可以用鼠标坐标去逐一判断与这些点的距离。
因此,对于第一个问题,建议一个如下的思路,也许你已经这么做了。
创建一个图形基类,该基类事实上是一个接口:
class 图形基类
{
public:
virtual void Draw( CDC * pDC ) = 0; // 画图形
virtual BOOL IsPointOnIt( CPoint& pt ) = 0; // 判断选中
........
};
创建一系列的图形元素,派生自图形基类
class 圆 : public 图形基类
{
public:
virtual void Draw( CDC * pDC ) { 画圆; }
virtual BOOL IsPointOnIt( CPoint& pt ) { 利用圆公式判断点是否在上面; }
};
class 曲线 : public 图形基类
{
public:
virtual void Draw( CDC * pDC ) { 画曲线; }
virtual BOOL IsPointOnIt( CPoint& pt ) { 判断散列点集合到点的距离; }
};
................
-------------------------
对于第二个问题:
这一这么做,画图形之前,首先要保存将要被覆盖的背景图,然后画上线。需要擦除的时候,把保存的背景图再贴上。
不过还有一个更简单的方法,就是使用“双缓冲”。每次的画图操作,都画在一个位图中,而不是真实的屏幕上。画图完成之后,再把位图一次性贴到窗口客户区(屏幕上)。这样不仅可以解决那个问题,而且还可以防止闪烁。
如果是矢量图,因为矢量图总是按照某种“算法”画出来的。计算点到图形的距离也有“算法”支持。如果是位图,对于你随意画的线条,如果你要保存这个线条,你一定会保存它一系列的点,那么你就可以用鼠标坐标去逐一判断与这些点的距离。
因此,对于第一个问题,建议一个如下的思路,也许你已经这么做了。
创建一个图形基类,该基类事实上是一个接口:
class 图形基类
{
public:
virtual void Draw( CDC * pDC ) = 0; // 画图形
virtual BOOL IsPointOnIt( CPoint& pt ) = 0; // 判断选中
........
};
创建一系列的图形元素,派生自图形基类
class 圆 : public 图形基类
{
public:
virtual void Draw( CDC * pDC ) { 画圆; }
virtual BOOL IsPointOnIt( CPoint& pt ) { 利用圆公式判断点是否在上面; }
};
class 曲线 : public 图形基类
{
public:
virtual void Draw( CDC * pDC ) { 画曲线; }
virtual BOOL IsPointOnIt( CPoint& pt ) { 判断散列点集合到点的距离; }
};
................
-------------------------
对于第二个问题:
这一这么做,画图形之前,首先要保存将要被覆盖的背景图,然后画上线。需要擦除的时候,把保存的背景图再贴上。
不过还有一个更简单的方法,就是使用“双缓冲”。每次的画图操作,都画在一个位图中,而不是真实的屏幕上。画图完成之后,再把位图一次性贴到窗口客户区(屏幕上)。这样不仅可以解决那个问题,而且还可以防止闪烁。
启帆信息
2024-11-19 广告
2024-11-19 广告
启帆信息是英伟达中国区代理商,原厂授权代理,提供全面的软件技术解决方案以及NVIDIA以太网产品、交换机等产品,欢迎前来咨询!...
点击进入详情页
本回答由启帆信息提供
展开全部
1.如果是规则曲线,比如B样条——VC上的曲线就是B样条。可以根据B样条的公式计算,当前点是否在曲线上,这方面你可以在网上找找B样条的拟合曲线公式。如果是离散的类似CAD里面的随手曲线,那是一个个的离散点组成的直线而已,一个个的判断计算就行了。
2.可以用 2个内存位图来实现,A用来绘制当前已经定型的记录下来的图元的绘制。B记录临时绘制对象。绘制某个图元过程中,如果鼠标移动,执行:BITBLT A->B,然后在B上绘制当前正编辑的图元数据,再将B的数据BITBLT到窗口。 这样能达到你的要求。
——这样,程序效率很高,且毫无闪烁,也不会产生反色消隐带来的图像失真。我做一个小软件就这样干的。
给我200分吧。
2.可以用 2个内存位图来实现,A用来绘制当前已经定型的记录下来的图元的绘制。B记录临时绘制对象。绘制某个图元过程中,如果鼠标移动,执行:BITBLT A->B,然后在B上绘制当前正编辑的图元数据,再将B的数据BITBLT到窗口。 这样能达到你的要求。
——这样,程序效率很高,且毫无闪烁,也不会产生反色消隐带来的图像失真。我做一个小软件就这样干的。
给我200分吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已经发送到楼主的邮箱
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询