【请教】宽画笔画折线的问题!!!

dongpy 2005-03-25 03:16:07
用宽画笔画折线、多边形有没有算法?我找了好久都没找到!

我先是想画了宽的线段,然后拼起来,但是在线段连接处很不自然。

想过在线段连接处填充个小圆,太麻烦,没做。

麻烦大家提供些思路,谢谢啊!


(这个问题困扰我好几天了)
...全文
94 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzwu 2005-03-27
  • 打赏
  • 举报
回复
两个线段求出的交点(x,y)的两个分量都是实数,误差是极小的。但要画到屏幕上去,必须四舍五入为整数格点,这样就会在两边产生不超出1/2的量化误差。

但这种误差是无法避免的,要消除它们的影响,只有两种办法:

1. 提高分辨率:例如把640*480提高为800*600,1024*768,1280*1024;

2. 采用反锯齿技术。
dongpy 2005-03-27
  • 打赏
  • 举报
回复
怪我没说清楚。

MFC和WINAPI的函数不能用,相当于要通过画点来实现。
zzwu 2005-03-27
  • 打赏
  • 举报
回复
可参看:

http://www.ggdn.net/forum/cgFAQ/cgFAQ.htm

的Section 1. 其中有点-线距离计算,有2线段交点的计算.
zzwu 2005-03-27
  • 打赏
  • 举报
回复
先求出包含多边形2根边的直线方程,
再求出与已知直线平行且距离为 宽度/2 的直线,
再利用平行线方程来计算交点.

以上计算中,都用实数表示方程的系数和坐标变量.
dongpy 2005-03-27
  • 打赏
  • 举报
回复
那么2侧平行线的交点,是不是根据线段夹角来计算? 还有没有其它计算方法呢?
dongpy 2005-03-26
  • 打赏
  • 举报
回复
宽画笔画折线, 实际就是为每一段折线的2侧各画一根平行线,再把同一侧的直线求出交点,而起始点和终止点则要作垂线封闭起来,再对封闭的折线进行填充就行了。
========================================
这样做是可以。只是2侧平行线的交点不好求,而且即使求出来误差也比较大。
梧桐168 2005-03-26
  • 打赏
  • 举报
回复
CreatePen(nPenStyle, nWidth, pLogBrush, nStyleCount, lpStyle));
梧桐168 2005-03-26
  • 打赏
  • 举报
回复
template <class T>
class CGDIObject : public CGDI
{
public:
CGDIObject(CDC* pDC) : CGDI(pDC), m_pLast(NULL)
{
}

virtual ~CGDIObject()
{
UnSelect();
m_cNewObj.DeleteObject();
}

inline void Select(T* pObject)
{
if (pObject)
{
m_pLast = m_pDC->SelectObject(pObject);
}
}

inline void UnSelect()
{
if (m_pLast)
{
Unused(m_pDC->SelectObject(m_pLast));
m_pLast = NULL;
}
}

protected:
T m_cNewObj;
T* m_pLast;
};

//*****************************************************************************
// Pens
//*****************************************************************************

class CSelPen : public CGDIObject<CPen>
{
public:
CSelPen(CDC * pDC, COLORREF col, int sty=PS_SOLID, int wid=1)
: CGDIObject<CPen>(pDC)
{
VERIFY(m_cNewObj.CreatePen(sty, wid, col));
Select(&m_cNewObj);
}

CSelPen(CDC * pDC, int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0,
const DWORD* lpStyle = NULL) : CGDIObject<CPen>(pDC)
{
VERIFY(m_cNewObj.CreatePen(nPenStyle, nWidth, pLogBrush, nStyleCount, lpStyle));
Select(&m_cNewObj);
}
};
sujinzhao407 2005-03-26
  • 打赏
  • 举报
回复
我觉得大家都把这个问题搞复杂了吧?拙见如下请参考:
CPen pen;
pen.CreatePen(PS_GEOMETRIC,5,RGB(255,0,0));
pDC->SelectObject(&pen);
其中在CreatePen()函数里的第二个参数值5可以更改,按照你的需要想多宽都行
zzwu 2005-03-25
  • 打赏
  • 举报
回复
宽画笔画折线, 实际就是为每一段折线的2侧各画一根平行线,再把同一侧的直线求出交点,而起始点和终止点则要作垂线封闭起来,再对封闭的折线进行填充就行了。

4,445

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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