给折线画平行线,硬是没搞清楚

牧童027 2005-03-08 04:15:42
要做一个给多段折线画平行线的程序。在看过http://dev.csdn.net/develop/article/13/13811.shtm文章后,还是搞不清楚那个角平分线方向B的COS和SIN是怎么求得的,还有那个d'也不晓得是怎么得到角平分线上的截距的,还请各位高手教教我。下面是我写的画平行线的代码,但肯定是个错的。

//画平行线
void CTest3View::DrawParallel(CDC *pDC)
{
ASSERT(pDC && pDC->GetSafeHdc());

double d = 10; //定义平行线与折线间距
double x, y, dx, dy, r, dec, b1, b2;
int i = 0;
//m_aryPoint中存放折线点集CArray<CPoint, CPoint> m_aryPoint;
if(m_aryPoint.GetSize() < 1) //若队列中的点少于一则不画
return;

x = m_aryPoint[0].x; //得到起始点
y = m_aryPoint[0].y;
pDC->MoveTo(x+d, y+d); //移DC到起始点

for(i=1; i<m_aryPoint.GetSize(); i++)
{
// dec = (y-m_aryPoint[i].y) / (x-m_aryPoint[i].x);
// b1 = (y+d) - dec*(x+d);
// b2 = (m_aryPoint[i].y) - ((-1)/dec)*(m_aryPoint[i].x);
// dx = (b2 - b1)/(dec - (-1)/dec);
// dy = (-1)/dec*dx + b2;
//
// pDC->LineTo(dx, dy);
// x = m_aryPoint[i].x, y = m_aryPoint[i].y;

dy = y - m_aryPoint[i].y; //Y方向的间距 对边
dx = m_aryPoint[i].x - x; //X方向的间距 邻边
r = sqrt(dy*dy + dx*dx); //斜边
dx = m_aryPoint[i].x + d*(-1)*(dy/r); //计算平行线X方向上的点 x0=x±d'×cosB
dy = m_aryPoint[i].y + d*(dx/r); //计算平行线Y方向上的点 y0=y±d'×sinB
pDC->LineTo(dx, dy); //画平行线
x = m_aryPoint[i].x, y = m_aryPoint[i].y; //对起始点重新赋值
}
}
...全文
268 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
牧童027 2005-03-08
To I_Love_CPP(我愛C++)
syy64(太平洋)
二位仁兄有画平行线段方面的可供参考的代码吗?我为这个调了一天了,可还是画不对。若有请发邮件给我。在下这里谢谢了。

我的邮箱 zgce@21cn.com
回复
中级伴读 2005-03-08
帮你up
回复
bzCpp 2005-03-08
Up
回复
牧童027 2005-03-08
不会这么惨吧,没得一个人理,连个UP的都没得?
回复
牧童027 2005-03-08
难道没人画过吗?怎么一个答的人都没得?
回复
syy64 2005-03-08
用坐标变换很容易,将直线置平,画出平行线后再转回去。
回复
I_Love_CPP 2005-03-08
"还是搞不清楚那个角平分线方向B的COS和SIN是怎么求得的,还有那个d'也不晓得是怎么得到角平分线上的截距的"
------------------------------------------------------
求折线的实质是确定几个转折点,顺次连接这些转折点即可。
d'是你自己设定的截距;
角度B是角平分线方向。

x0=x±d'×cosB
y0=y±d'×sinB

回复
相关推荐
发帖
图形处理/算法
创建于2007-09-28

1.9w+

社区成员

VC/MFC 图形处理/算法
申请成为版主
帖子事件
创建了帖子
2005-03-08 04:15
社区公告
暂无公告