给折线画平行线,试了半天硬是没搞清楚!

牧童027 2005-03-08 04:18:25
我要做一个给多段折线画平行线的程序。在看过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; //对起始点重新赋值
}
}
...全文
361 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongpy 2005-03-09
  • 打赏
  • 举报
回复
我没有源代码,你的代码我没法调试。
大致看了一下,

pDC->MoveTo(x-d, y-d); //移动到起始点,这里有点问题

//这边不对,起始点坐标要根据角度来定的。
dongpy 2005-03-08
  • 打赏
  • 举报
回复
d'是这样算的:
设折线XYZ,线段YX、YZ与x轴的夹角可以得到,设B1、B2

d = d'*sin|B - B1| ,即,d' = d/sin|B - B1|.


P.S. 根据角平分线的正反方向,B会有2个值。
寻开心 2005-03-08
  • 打赏
  • 举报
回复
用角分线慢,三角函数费时间
算角度不要用atn,应该用atan2

牧童027 2005-03-08
  • 打赏
  • 举报
回复
请dongpy(51-->ARM)帮忙看看。
请您再讲讲那个d'是怎么算来的吧,还有您说的那个B=(B1+B2)/2里面那个B1和B2是通过斜率求atan得出来的吗?怎么我又试了试还是不对。下面是我写的代码

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

double d = 10;
double x, y, dx, dy, r, dec, b1, b2;
int i = 0;

if(m_aryPoint.GetSize() < 1)
return;

x = m_aryPoint[0].x;
y = m_aryPoint[0].y;
pDC->MoveTo(x+d, y+d); //移动到起始点,这里有点问题

for(i=1; i<m_aryPoint.GetSize(); i++)
{
dec = (double)(m_aryPoint[i].y-m_aryPoint[i-1].y) / (m_aryPoint[i].x - m_aryPoint[i-1].x);
b1 = atan(dec); //求B1
//若是最后一点,则在这点上做线段的垂线
if(i == m_aryPoint.GetSize()-1)
b2 = AGP_PI/2 + b1;
else
{
dec = (double)(m_aryPoint[i+1].y - m_aryPoint[i].y) / (m_aryPoint[i+1].x - m_aryPoint[i].x);
b2 = atan(dec); //求B2
}
//算点的位置但不知道D应该怎么算
dx = m_aryPoint[i].x + d*cos((b1+b2)/2);
dy = m_aryPoint[i].y - d*sin((b1+b2)/2);
pDC->LineTo(dx, dy);
x = m_aryPoint[i].x, y = m_aryPoint[i].y;

pDC->LineTo(dx, dy);
}
}
牧童027 2005-03-08
  • 打赏
  • 举报
回复
哦,忘记说我的邮箱了。 zgce@21cn.com
牧童027 2005-03-08
  • 打赏
  • 举报
回复
to happy__888([顾问团]寻开心)
to dongpy(51-->ARM)
若二位没有相关可参照的源码,还请二位帮我看看这段代码,我就是按照公式写的呀,怎么还是画不对。调了一天了,可就是搞不好。还劳烦二位或路过的热心朋友给看看。在下这里谢谢了。
//////////////////////////////////////////////////////////////////////////
//画平行线
#define AGP_PI 3.1415926535897932384626433832795
void CTest3View::DrawParallel(CDC *pDC)
{
ASSERT(pDC && pDC->GetSafeHdc());

double d = 10;
double x, y, dx, dy, r, dec, b1, b2;
int i = 0;
CRect rc;

GetClientRect(&rc);
if(m_aryPoint.GetSize() < 1)
return;

x = m_aryPoint[0].x;
y = m_aryPoint[0].y;
pDC->MoveTo(x-d, y-d); //移动到起始点,这里有点问题

for(i=1; i<m_aryPoint.GetSize(); i++)
{
dec = (double)(m_aryPoint[i].y-m_aryPoint[i-1].y) / (m_aryPoint[i].x - m_aryPoint[i-1].x);
//求B1
b1 = atan2(m_aryPoint[i].y - m_aryPoint[i-1].y, m_aryPoint[i].x - m_aryPoint[i-1].x);
//若是最后一点,则在这点上做线段的垂线
if(i == m_aryPoint.GetSize()-1)
b2 = (AGP_PI + 2*b1)/2;
else
{
dec = (double)(m_aryPoint[i+1].y - m_aryPoint[i].y) / (m_aryPoint[i+1].x - m_aryPoint[i].x);
//求B2
b2 = atan2(m_aryPoint[i+1].y - m_aryPoint[i].y, m_aryPoint[i+1].x - m_aryPoint[i].x);
}
//计算X0和Y0 x=x0+d'cosB y=y0+d'sinB
dx = m_aryPoint[i].x + d/sin(fabs((b2-b1)/2))*cos((b1+b2)/2);
dy = m_aryPoint[i].y + d/sin(fabs((b2-b1)/2))*sin((b1+b2)/2);
pDC->LineTo(dx, dy);
}//end for i
}
牧童027 2005-03-08
  • 打赏
  • 举报
回复
to happy__888([顾问团]寻开心)
to dongpy(51-->ARM)
请问二位有可参照的源代码吗?我改了一天了,可还是画不对。
寻开心 2005-03-08
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3410/3410637.xml?temp=.2962915
zhousqy 2005-03-08
  • 打赏
  • 举报
回复
up
yjh1982 2005-03-08
  • 打赏
  • 举报
回复
数学知识,不记得了...
牧童027 2005-03-08
  • 打赏
  • 举报
回复
请问dongpy(51-->ARM) 那个 d'是怎么算出来的呀?我试了试好象跟那个d'有关系,若我用d的话不是平行线。
牧童027 2005-03-08
  • 打赏
  • 举报
回复
哦,(B1+B2)/2就可以得到B吗?我试试。
还有那个D'是怎么得出来的?
dongpy 2005-03-08
  • 打赏
  • 举报
回复
B是角平分线方向与x轴的夹角。
设折线XYZ,线段YX、YZ与x轴的夹角可以得到,设B1、B2,则B=(B1+B2)/2
SIN和COS就可以得到了。

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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