找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1303|回复: 7

[求助]:如何实现类似CAD中offset的C算法?

[复制链接]
发表于 2005-9-1 17:18:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
小弟想做一个简单的绘图软件,在做到偏移的时候,不知道如何实现了。大伙指点指点啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-9-1 17:34:26 | 显示全部楼层
调用cad里的offset函数,比如AcGeCurve2d::getTrimmedOffset
否则就自己慢慢研究几何,慢慢写吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-1 22:57:37 | 显示全部楼层
估计只能研究几何了。。。太麻烦了,几个象限,方向已经把人搞糊涂了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-13 15:53:34 | 显示全部楼层
使用getTransformBy()可以实现,这个函数需要传入一个变换矩阵和一个点坐标,在变换矩阵中你可以设置缩放或偏移
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-9 14:45:58 | 显示全部楼层
用解析几何的方法算坐标吧,烦一点,不过简单的东西应该能实现的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-25 14:59:46 | 显示全部楼层
我写的 没时间再折腾了,你看看有用吗
int offset(int &x1,int &y1,int &x2,int &y2,int delta)
{
        Cx Line1;
        Line1.Add(Cd(x1,y1));
        Line1.Add(Cd(x2,y2));
        Cx Line2;
        int res=offset(Line1,delta,Line2);
        if(res)
        {
                x1=(int)Line2[0].x;
                y1=(int)Line2[0].y;

                x2=(int)Line2[1].x;
                y2=(int)Line2[1].y;
        }
        return res;
}
int  offset(Cx Line1 ,double delta,Cx &Line2)
//offset
//0 无效
//1 有效
//delta >0 右移 delta <0 左移
//x1 ==>> x2
{
        int Upper=Line1.GetUpperBound();
        if(Upper <1) return 0;//无效
        for(int i=0;i<Upper;i++)
        {
                if(fabs(Line1.x-Line1[i+1].x) < 0.001 && fabs(Line1.y-Line1[i+1].y) < 0.001)
                {
                        Line1.RemoveAt(i+1);//滤掉直线段长度为0的点,否则图不对
                        Upper--;
                }
        }

        if(Upper < 1 )
                return 0;

        Cfx fx,ffx;//方向,反方向
        if(delta < 0)
        {
                fx=Left;
                ffx = Right;
        }
        else
        {
                ffx=Left;
                fx = Right;
        }
        double x1,y1,x2,y2,x3,y3,x4,y4;
        qxzjzb(Line1[1].x,Line1[1].y,Line1[0].x,Line1[0].y,fabs(delta),ffx,x1,y1);
        qxzjzb(Line1[0].x,Line1[0].y,Line1[1].x,Line1[1].y,fabs(delta), fx,x2,y2);

        Line2.Add(Cd(x1,y1));
        if(Upper < 2)
                Line2.Add(Cd(x2,y2));

        for(i=1;i<Upper;i++)
        {
                qxzjzb(Line1.x,Line1.y,Line1[i+1].x,Line1[i+1].y,fabs(delta), fx,x4,y4);
                qxzjzb(Line1[i+1].x,Line1[i+1].y,Line1.x,Line1.y,fabs(delta),ffx,x3,y3);
                Cd d;
                if(Intersect(Cd(x1,y1),Cd(x2,y2),Cd(x4,y4),Cd(x3,y3),d)==0)
                        int temp=0;
                Line2.Add(d);
                x1=x3,x2=x4,y1=y3,y2=y4;
        }
        qxzjzb(Line1[Upper-1].x,Line1[Upper-1].y,Line1[Upper].x,Line1[Upper].y,fabs(delta), fx,x4,y4);
        Line2.Add(Cd(x4,y4));
        return Upper+1;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-25 23:32:52 | 显示全部楼层
估计只能研究几何了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-26 12:36:11 | 显示全部楼层
我的简单思路,前后两条线段分别平移后求交,所有交点的坐标就是平移后的线条。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-22 10:08 , Processed in 0.440012 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表