关于画笔的问题

huaqingci 2009-02-17 01:37:05
比如我想从A点到B点画一个线格式差不多是,+ + + + + + + 或者X X X X X X X 或者- + -+ -+ -,这样的线,可能描述起来有些麻烦,总是是一个自己定义的线型,要怎么办呢,
...全文
214 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tinary3v0 2009-02-18
  • 打赏
  • 举报
回复
我处理这个问题的时候用的是GDI+
如果楼主所说的线是直线(多线折线那种) 可以不使用GDI+ 直接进行计算就行了 将直线先按照间距划分成点集 然后 通过角度运算 在各个点绘制响应的符号就行了

当然 如果用GDI+的话 不光是折线类型就算是Curve曲线也能做到

具体做法也比较麻烦 大致说一下

首先将线统一保存成一个GraphicsPath path; GraphicsPath有个Winden方法 需要使用一个画笔Pen wdPen;来扩充路径

把这个画笔设定成宽度为符号宽度的大小例如8个像素 还需要设定这个画笔为虚线类型 虚线的间隔也根据你的需要定

然后使用path.Winden(&wdPen); 这样就会得到由一系列矩形(可能不规则,需要自己处理一下)组成的曲线 而各个矩形的顶点(包括通过顶点可以计算出的各个顶点连线的的中点)就是你要找的绘制+ X — 等的位置信息

如果得到这些矩形框呢? 还要使用另外一个类 GraphicsPathIterator pathIterator( &path );
通过pathIterator可以得到这个路径中各个封闭单元 也就是子路径 也就是各个小矩形框的路径 假设为minPath[],类型同样为GraphicsPath;

最后使用GraphicsPath的GetPathData方法 得到minPath[i]的四个顶点信息 最后通过四个顶点信息绘制你要的图形。

Graphics g(pdc->m_hDC);
g.SetSmoothingMode(SmoothingModeHighQuality);

Pen bpen ( Color( 255,0,0,255),1 );
Pen gpen( Color( 255,0,255,0),1 );

PointF pt[4];

pt[0] = PointF( 100,100 );
pt[1] = PointF( 100,150 );
pt[2] = PointF( 150,200 );
pt[3] = PointF( 200,120 );

for( INT i = 0; i< 4; i++ )
{
g.DrawEllipse( &pen,pt[i].X-2,pt[i].Y-2, REAL(4),REAL(4) );
}

GraphicsPath OP;
OP.AddCurve( pt, 4 );

Pen woPen( Color( 0, 0, 0, 0 ), 8 );
REAL dashValues[2] = { float(1),float(1) };
woPen.SetDashPattern( dashValues, 2);

OP.Widen( &woPen );

g.DrawPath(&bpen,&OP );


GraphicsPathIterator pathIterator( &OP );
INT subpathCount = pathIterator.GetSubpathCount( );

GraphicsPath minPath[50];
PathData ExDT[50];

BOOL ExClose = TRUE;
for( int k = 0; k< subpathCount; k++ )
{
pathIterator.NextSubpath( &minPath[k], &ExClose );
minPath[k].GetPathData( &ExDT[k] );
}

for( int j = 0; j< ExDT[4].Count; j++ )
{
g.DrawEllipse( &gpen,ExDT[4].Points[j].X-1,ExDT[4].Points[j].Y-1,REAL(2),REAL(2));
}

上面是我写了一个实例 有很多地方需要你自己去琢磨的
效果图如下:


得到点了以后怎么画线 应该就不是问题了 注意这个过程中数组用的会很多 防止数组越界
wyc761024 2009-02-18
  • 打赏
  • 举报
回复
离散成点以后直接就可以进行旋转了,使用一个点旋转算法应该就可以达到你要的目的了。
  • 打赏
  • 举报
回复
用GDI+
huaqingci 2009-02-17
  • 打赏
  • 举报
回复
我用画刷填充,试过了,这样,线是不会自动旋转的,比如说45度,应该是这条给上的条纹也旋转45度
wyc761024 2009-02-17
  • 打赏
  • 举报
回复
嘿嘿,1楼都说完了,我稍微补充下,如果你需要的线型不是系统自带的,那么就使用楼上的方法,如果是系统自带的那么就很方便了。
叶落寒山 2009-02-17
  • 打赏
  • 举报
回复
自己写画线的函数,

void MyLine(CPoint begin,CPoint end,COLOR color,int LineStyle)
{
Switch(LineStyle)
{
case 0: // +++++++
{
// 绘制+++++
SetPixel();// 打点函数,实现+++++效果
break;
}
case 1: // XXXXXX
{
// 绘制XXXXXX
SetPixel();// 打点函数,实现XXXXXX效果 .提供一个思路是:建立一个线型表数组,需要显示的点用1表示,不需要显示的点用0表示。通过与操作
// 来判断该位置是打点,还是不打点。
break;
}
......
default:
break;
}
}
fandh 2009-02-17
  • 打赏
  • 举报
回复
一种是自己画,将线离散成点,每一点画你的符号(根据不同,可以间隔画不一样的);
另外一种,就说填充!用画刷填充!

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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