=====文件名:DrawShape.h=====
#ifndef __DRAWINGS_H_INCLUDED__
#define __DRAWINGS_H_INCLUDED__
#include <wx/dc.h>
#include <wx/dcmemory.h>
//------------------------------------------------------------------------------
wxColour ChangeBrightness(const wxColour &ar_color, int percents)
{
return wxColour(wxMin(255,int(ar_color.Red ())*percents/100),
wxMin(255,int(ar_color.Green())*percents/100),
wxMin(255,int(ar_color.Blue ())*percents/100));
}
//------------------------------------------------------------------------------
void DrawGradientRect (wxDC& dc, wxRect rect, wxColour color_top, wxColour color_bottom, int a_transparency_percent=0)
{
if (a_transparency_percent > 100) a_transparency_percent = 100;
if (a_transparency_percent < 0) a_transparency_percent = 0;
if (a_transparency_percent == 0)
{
dc.SetPen(*wxTRANSPARENT_PEN);
int R0=color_top.Red(),
G0=color_top.Green(),
B0=color_top.Blue(),
R1=color_bottom.Red(),
G1=color_bottom.Green(),
B1=color_bottom.Blue();
int y;
for (y=rect.GetTop(); y<=rect.GetBottom(); y++)
{
int R=R0+(R1-R0)*(y-rect.GetTop())/rect.GetHeight(),
G=G0+(G1-G0)*(y-rect.GetTop())/rect.GetHeight(),
B=B0+(B1-B0)*(y-rect.GetTop())/rect.GetHeight();
dc.SetBrush(wxBrush(wxColour(R,G,B),wxSOLID));
dc.DrawRectangle(rect.GetLeft(),y,rect.GetWidth(),1);
}
}
else
{
wxBitmap bmp(rect.GetWidth(), rect.GetHeight());
wxMemoryDC mem_dc;
mem_dc.SelectObject(bmp);
int R0=color_top.Red(), G0=color_top.Green(), B0=color_top.Blue(),
R1=color_bottom.Red(), G1=color_bottom.Green(), B1=color_bottom.Blue();
for (int y=0; y<rect.GetHeight(); ++y)
{
int R=R0+((R1-R0)*y)/(rect.GetHeight() - 1),
G=G0+((G1-G0)*y)/(rect.GetHeight() - 1),
B=B0+((B1-B0)*y)/(rect.GetHeight() - 1);
mem_dc.SetPen(wxPen(wxColour(R,G,B), 1, wxSOLID));
mem_dc.DrawLine(0, y, rect.GetWidth()-1, y);
}
mem_dc.SelectObject(wxNullBitmap);
wxImage img;
img = bmp.ConvertToImage();
img.InitAlpha();
unsigned char *alpha_plane = img.GetAlpha();
int alpha = (a_transparency_percent*255)/100;
memset(alpha_plane, alpha, rect.GetWidth()*rect.GetHeight());
wxBitmap final_bmp(img, 32);
dc.DrawBitmap(final_bmp, rect.GetLeftTop(), true);
}
}
//------------------------------------------------------------------------------
void DrawGradientCircle(wxDC& dc, wxPoint center, int radius, wxColour color_top, wxColour color_bottom)
{
dc.SetPen(*wxTRANSPARENT_PEN);
int R0=color_top.Red(),
G0=color_top.Green(),
B0=color_top.Blue(),
R1=color_bottom.Red(),
G1=color_bottom.Green(),
B1=color_bottom.Blue();
int y;
for (y=-radius; y<=radius; y++)
{
int R=R0+(R1-R0)*(y+radius)/(2*radius),
G=G0+(G1-G0)*(y+radius)/(2*radius),
B=B0+(B1-B0)*(y+radius)/(2*radius);
dc.SetBrush(wxBrush(wxColour(R,G,B),wxSOLID));
double r=y;
if (r<0)
r=-r;
r=wxMax(0.0,r-0.5);
int x=int(sqrt(double(radius*radius-r*r))+0.5);
dc.DrawRectangle(center.x-x,center.y+y,x*2+1,1);
}
}
//------------------------------------------------------------------------------
void DrawGradientSphere(wxDC& dc, wxPoint center, int radius, wxColour color)
{
dc.SetPen(*wxTRANSPARENT_PEN);
int R0=color.Red(),
G0=color.Green(),
B0=color.Blue();
int dcol=wxMin(255-R0,wxMin(255-G0,255-B0));
int R1=R0+dcol,
G1=G0+dcol,
B1=B0+dcol;
wxColour dark=ChangeBrightness(color,50);
int R2=dark.Red(),
G2=dark.Green(),
B2=dark.Blue();
int R,G,B;
for (int y=radius*2; y>0; y--)
{
if (y>radius)
{
R=R0+(R2-R0)*(y-radius)/radius;
G=G0+(G2-G0)*(y-radius)/radius;
B=B0+(B2-B0)*(y-radius)/radius;
}
else
{
R=R1+(R0-R1)*y/radius;
G=G1+(G0-G1)*y/radius;
B=B1+(B0-B1)*y/radius;
}
dc.SetBrush(wxColour(R,G,B));
dc.DrawEllipse(center.x-(radius*2-y)/6-(y+1)/2,
center.y-(radius*2-y)/6-(y+1)/2,
y+1,
y+1);
}
/* int y;
int h=radius*2/3;
for (y=-radius; y<=radius; y++)
{
if (y+radius<h)
{
R=R0+(R1-R0)*(y+radius)/h;
G=G0+(G1-G0)*(y+radius)/h;
B=B0+(B1-B0)*(y+radius)/h;
}
else if (y+radius<2*h)
{
R=R1+(R0-R1)*(y+radius-h)/h;
G=G1+(G0-G1)*(y+radius-h)/h;
B=B1+(B0-B1)*(y+radius-h)/h;
}
else
{
R=R0+(R2-R0)*(y+radius-2*h)/h;
G=G0+(G2-G0)*(y+radius-2*h)/h;
B=B0+(B2-B0)*(y+radius-2*h)/h;
}
dc.SetBrush(wxBrush(wxColour(R,G,B),wxSOLID));
double r=y;
if (r<0)
r=-r;
r=wxMax(0.0,r-0.5);
int x=int(sqrt(double(radius*radius-r*r))+0.5);
dc.DrawRectangle(center.x-x,center.y+y,x*2+1,1);
}
*/
}
//------------------------------------------------------------------------------
void DrawCylinderHor(wxDC& dc, wxRect rect, wxColour color)
{
dc.SetPen(*wxTRANSPARENT_PEN);
int R=color.Red(),
G=color.Green(),
B=color.Blue();
int dcol=wxMin(255-R,wxMin(255-G,255-B));
R+=dcol;
G+=dcol;
B+=dcol;
wxColour dark=ChangeBrightness(color,50);
int h=rect.height/3;
DrawGradientRect(dc,wxRect(rect.x,rect.y ,rect.width,h),color,wxColour(R,G,B));
DrawGradientRect(dc,wxRect(rect.x,rect.y+h ,rect.width,h),wxColour(R,G,B),color);
DrawGradientRect(dc,wxRect(rect.x,rect.y+h*2,rect.width,rect.height-h*2),color,dark);
}
//------------------------------------------------------------------------------
void CalcEllipsePoint (wxRect rect, wxPoint *pts)
{
double a=rect.width;
double b=rect.height;
a/=2;
b/=2;
pts[0]=wxPoint(rect.x,rect.y+rect.height/2);
pts[rect.width]=wxPoint(rect.x+rect.width,rect.y+rect.height/2);
for (int x=1; x<rect.width; x++)
{
double x1=double(rect.width)/2-x;
double y=b/a*sqrt(wxMax(0,a*a-x1*x1));
pts[x ].x=
pts[rect.width*2-x].x=rect.x+x;
pts[x ].y=int(rect.y+double(rect.height)/2+y);
pts[rect.width*2-x].y=int(rect.y+double(rect.height)/2-y);
}
}
void DrawCylinderVer(wxDC& dc, wxRect rect, wxColour color)
{
wxPoint *pts=new wxPoint[rect.width*2];
wxRect el_rect=rect;
el_rect.y-=rect.width/4;
el_rect.height=rect.width/2;
CalcEllipsePoint(el_rect,pts);
dc.SetBrush(color);
dc.SetPen(color);
dc.DrawPolygon(rect.width*2,pts);
int R1=color.Red(),
G1=color.Green(),
B1=color.Blue();
int dcol=wxMin(255-R1,wxMin(255-G1,255-B1));
int R2=R1+dcol,
G2=G1+dcol,
B2=B1+dcol;
wxColour dark=ChangeBrightness(color,50);
int R3=color.Red(),
G3=color.Green(),
B3=color.Blue();
int w_3=rect.width/3;
for (int i=0; i<=rect.width; i++)
{
wxColour col;
if (i<w_3)
col=wxColour(R1+i*(R2-R1)/w_3,
G1+i*(G2-G1)/w_3,
B1+i*(B2-B1)/w_3);
else if (i<w_3*2)
col=wxColour(R2+(i-w_3)*(R1-R2)/w_3,
G2+(i-w_3)*(G1-G2)/w_3,
B2+(i-w_3)*(B1-B2)/w_3);
else
col=wxColour(R1+(i-w_3*2)*(R3-R1)/w_3,
G1+(i-w_3*2)*(G3-G1)/w_3,
B1+(i-w_3*2)*(B3-B1)/w_3);
dc.SetPen(col);
dc.DrawLine(rect.x+i,pts[i].y,rect.x+i,pts[i].y+rect.height);
}
delete[] pts;
}
//------------------------------------------------------------------------------
void DrawCylinderVerHatch(wxDC& dc, wxRect rect, wxColour color)
{
wxPoint *pts=new wxPoint[rect.width*2+2];
wxRect el_rect=rect;
el_rect.y-=rect.width/4;
el_rect.height=rect.width/2;
CalcEllipsePoint(el_rect,pts);
for (int i=rect.width*2+1; i>=0; i--)
{
if (i==rect.width*2+1)
pts[i]=pts[0];
else if (i>rect.width)
{
pts[i].x=pts[i-1].x;
pts[i].y=pts[i-1].y;
}
else if (i<=rect.width)
pts[i].y+=rect.height;
}
dc.SetBrush(wxBrush(color, wxBDIAGONAL_HATCH));
dc.SetPen(color);
dc.DrawPolygon(rect.width*2+2,pts);
CalcEllipsePoint(el_rect,pts);
dc.SetBrush(*wxWHITE);
dc.DrawPolygon(rect.width*2,pts);
}
//------------------------------------------------------------------------------
void DrawCylinderVerContour(wxDC& dc, wxRect rect, wxColour color)
{
wxPoint *pts=new wxPoint[rect.width*2+2];
wxRect el_rect=rect;
el_rect.y-=rect.width/3;
el_rect.height=rect.width*2/3;
CalcEllipsePoint(el_rect,pts);
for (int i=rect.width*2+1; i>=0; i--)
{
if (i==rect.width*2+1)
pts[i]=pts[0];
else if (i>rect.width)
{
pts[i].x=pts[i-1].x;
pts[i].y=pts[i-1].y;
}
else if (i<=rect.width)
pts[i].y+=rect.height;
}
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.SetPen(color);
dc.DrawPolygon(rect.width*2+2,pts);
}
////////////////////////////////////////////////////////////////////////////////
#endif // __DRAWINGS_H_INCLUDED__
分享到:
相关推荐
通过这些基本的绘图函数,你可以结合MFC的事件处理机制,在窗口上响应用户的交互,比如鼠标点击或移动,动态绘制图形。记住,每次绘图前都要确保有有效的CDC对象,并在完成后释放资源。 总之,MFC提供了一套完整的...
在 Siemens 的 WinCC7.5 人机界面(HMI)软件中,绘制不规则图形并为其填充背景颜色是一项常见的需求,特别是在创建自定义图形元素或交互式控件时。WinCC7.5 提供了多种工具来实现这一目标,但默认的折线工具并不支持...
本教程将详细解释如何利用C#和VS2013来实现一个功能,即允许用户通过鼠标绘制任意图形,并能够更改所绘制图形的填充颜色。 首先,我们需要创建一个新的Windows Forms项目。在VS2013中,选择“文件” -> “新建” ->...
【种子填充算法】是图形填充的核心算法之一。它的基本思想是通过一个“种子点”开始,判断该点的颜色是否与目标填充颜色一致,如果一致,则将该点标记为已填充,并检查其相邻点,依次进行递归填充。这个过程会一直...
VC 绘制几何图形填充图形的例子,可绘制直线、椭圆、矩形,可以设置线宽和填充色,点击墨水瓶图标即可填充闭合的几何图形,一定是闭合的图形哦,不闭合是不能填充的。本源代码可让你了解VC 简单的图形绘制方面的技巧...
- **设计与艺术**:在平面设计、插图、UI设计等领域,不规则图形填充是创造独特视觉效果的重要手段。 - **地理信息系统**:地图绘制中,不规则区域的填充常用于表示行政区域、地形等。 - **工程制图**:在机械、...
绘制圆形并填充斜线,可自定义圆的半径, 定义直线的倾角,角度值(-90°至90°),定义直线的间距
MATLAB绘制圆形并填充斜线 源程序代码.7z
在本文中,我们将深入探讨C#中的GDI+技术,特别是在绘制图形方面,特别是如何实现分层、拖放、缩放以及填充等高级功能。GDI+是.NET框架中的一个核心部分,它提供了丰富的图形绘制功能,使得程序员能够创建出交互式且...
5. 绘制图形:在片段着色器中,根据纹理坐标从纹理中采样颜色,然后应用到屏幕上的像素。 在给定的压缩包文件"020绘制用纹理填充的图形"中,可能包含了示例代码,演示如何在实际项目中实现上述过程。通过学习和分析...
在`OnDraw`函数中,我们可以调用`CDC`类提供的绘图方法,如`MoveTo`和`LineTo`来绘制多边形的轮廓,以及自定义的填充算法来填充内部。 资源文件“多边形平滑填充(颜色过渡三角形)”可能包含了实现上述逻辑的代码...
这个类可以创建一个可调整大小和形状的矩形或椭圆的追踪器,使用户在绘制图形时能看到实时的边界框。你可以根据需求定制CRectTracker的行为,使其适应封闭路径的追踪。 综上所述,实现“图形学填充算法”需要掌握...
2. **图形绘制**:MFC的`CDC`(Device Context)类提供了绘制图形的方法,如`MoveTo`、`LineTo`、`Polygon`等。用户定义的顶点列表可以通过`Polygon`函数绘制为一个多边形的轮廓。同时,`CDC`也提供了`FillPolygon`...
在计算机图形学中,边填充算法是一种常见的技术,用于在屏幕上填充特定区域,例如绘制图形、填充颜色或进行图像处理。这个算法在游戏开发、可视化软件、图形编辑工具等应用中都有广泛的应用。 边填充算法的实现通常...
简单种子填充,也称为4邻域或8邻域填充,是图形填充的直观方法。从一个已知的“种子”像素开始,检查它的相邻像素是否在多边形内部。如果是,就将这些像素标记为填充并继续检查它们的相邻像素。这个过程会递归地填充...
Picture Box通常用于显示图片或绘制自定义图形,而Form本身也可以作为一个画布来绘制图形。对于填充图形,我们主要会用到GDI+(Graphics Device Interface plus)图形库,它为VB提供了丰富的图形绘制功能。 要填充...
首先,我们需要导入`System.Drawing`命名空间,它包含了绘制图形所需的类和方法。在VB代码的开头添加以下语句: ```vb Imports System.Drawing ``` 1. **五角星绘制**: 五角星的绘制可以通过计算坐标点并连接...
计算机图形学是信息技术领域的一个重要分支...理解并熟练掌握这些算法,对于从事图形编程、游戏开发或相关领域的专业人士来说,是必不可少的技能。通过不断实践和优化,我们可以创造出更加生动、真实的计算机图形世界。