CAD软件中,图形(直线,圆,多边形等)的拾取是怎么样实现的

leejd 2003-03-20 04:40:16
目前所有的CAD软件,都可以做到对图形的拾取,并对图形进行操作。其数据组织结构我大概明白,但是我对图形拾取部分不是很了解。怎么样判断出鼠标所选的区域含有图形,并在内存中检测出其属性,然后对完整的图形进行加亮显示?

还有,CAD软件一般都能做到无级缩放,这个原理是什么,怎么样在我的程序中显示放大后的图形的可视部分?

...全文
240 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
meCAD 2003-03-23
  • 打赏
  • 举报
回复
这是选择直线图元的例子.抄书上来的.
bool PickLine(LINENODE *linenode)
{
bool returncode = false;
double x = PrePoint.x-linnode->Start.x;
double y = PrePoint.y-linnode->Start.y;

double a = linenode->End.x-linenode->Start.x;
double b = linenode->End.y-linenode->Start.y;
double c = sqrt(a*a+b*b);

double sin = b/c;
double cos = a/c;

double chg_x = x*cos+y*sin;
double chg_y = -x*sin+y*cos;

if(fabs(chg_y)<5.0 && (chg_x>=0 && chg_x<=c))
returncode = true;

return returncode;
}


直线:
struct LINNODE
{
BYTE bType; //绘图单元的类型
int bDo;
//该记录的状态:比如 bDo>0 不显示此单元 =1 显示. =2被选择. =3移动等..
int Index; //图元索引
POINT Start; //直线的起点.
POINT End; //直线的终点.
LINENODE() //直线图元的初始化函数
{
bType = LINE; //
bDo = 1;
};
};
如果该直线图元被选中的则函数返回true,否则返回false;,其中.参数linenode为检索出的直线图元数据指针, PrePoint 为上次老鼠单击的位置
woodgl 2003-03-23
  • 打赏
  • 举报
回复
直线的拾取:
1.给一直线p1p2,和一点p
2.设定一拾取半径d,一般小于3个像素。
3.构造一矩形r=(p.x-d, p.y-d, p.x+d, p.y+d)
4.如果p1p2和r相交,则可认为点p在p1p2上
基本原理就这样,其它的自己设计吧。。。。。。。
速度问题,要用双缓冲和剪裁。。。。。
Lewolf 2003-03-21
  • 打赏
  • 举报
回复
这就是人家的技术机密了,我也尝试过放缩等功能,可是速度要差的多。
yyqing 2003-03-21
  • 打赏
  • 举报
回复
1.采用数值逼近算法确定图形的选取
2.在程序中按指定比例放大图形,将屏幕显示部分映射到放大后的图形上,截取映射图形即可显示可视部分

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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