`
dqifa
  • 浏览: 116381 次
社区版块
存档分类
最新评论

绘制图形并填充

阅读更多
        =====文件名: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画直线、圆、椭圆、矩形、填充等

    通过这些基本的绘图函数,你可以结合MFC的事件处理机制,在窗口上响应用户的交互,比如鼠标点击或移动,动态绘制图形。记住,每次绘图前都要确保有有效的CDC对象,并在完成后释放资源。 总之,MFC提供了一套完整的...

    Wincc7.5中如何绘制不规则图形并填充背景颜色?.docx

    在 Siemens 的 WinCC7.5 人机界面(HMI)软件中,绘制不规则图形并为其填充背景颜色是一项常见的需求,特别是在创建自定义图形元素或交互式控件时。WinCC7.5 提供了多种工具来实现这一目标,但默认的折线工具并不支持...

    使用鼠标绘制任意图形并更改填充颜色

    本教程将详细解释如何利用C#和VS2013来实现一个功能,即允许用户通过鼠标绘制任意图形,并能够更改所绘制图形的填充颜色。 首先,我们需要创建一个新的Windows Forms项目。在VS2013中,选择“文件” -&gt; “新建” -&gt;...

    图形学 填充 C语言

    【种子填充算法】是图形填充的核心算法之一。它的基本思想是通过一个“种子点”开始,判断该点的颜色是否与目标填充颜色一致,如果一致,则将该点标记为已填充,并检查其相邻点,依次进行递归填充。这个过程会一直...

    VC 绘制几何图形填充图形.rar

    VC 绘制几何图形填充图形的例子,可绘制直线、椭圆、矩形,可以设置线宽和填充色,点击墨水瓶图标即可填充闭合的几何图形,一定是闭合的图形哦,不闭合是不能填充的。本源代码可让你了解VC 简单的图形绘制方面的技巧...

    画不规则图形并填充不规则图形

    - **设计与艺术**:在平面设计、插图、UI设计等领域,不规则图形填充是创造独特视觉效果的重要手段。 - **地理信息系统**:地图绘制中,不规则区域的填充常用于表示行政区域、地形等。 - **工程制图**:在机械、...

    MATLAB绘制圆形并填充斜线.rar_matlab圆形填充_matlab斜线填充_matlab添加斜线_填充斜线_斜的圆柱ma

    绘制圆形并填充斜线,可自定义圆的半径, 定义直线的倾角,角度值(-90°至90°),定义直线的间距

    MATLAB绘制圆形并填充斜线 源程序代码.7z

    MATLAB绘制圆形并填充斜线 源程序代码.7z

    C#的GDI+绘制图形分层拖放操作源码

    在本文中,我们将深入探讨C#中的GDI+技术,特别是在绘制图形方面,特别是如何实现分层、拖放、缩放以及填充等高级功能。GDI+是.NET框架中的一个核心部分,它提供了丰富的图形绘制功能,使得程序员能够创建出交互式且...

    绘制用纹理填充的图形

    5. 绘制图形:在片段着色器中,根据纹理坐标从纹理中采样颜色,然后应用到屏幕上的像素。 在给定的压缩包文件"020绘制用纹理填充的图形"中,可能包含了示例代码,演示如何在实际项目中实现上述过程。通过学习和分析...

    计算机图形学(MFC)-多边形平滑填充(颜色渐变效果进行填充)

    在`OnDraw`函数中,我们可以调用`CDC`类提供的绘图方法,如`MoveTo`和`LineTo`来绘制多边形的轮廓,以及自定义的填充算法来填充内部。 资源文件“多边形平滑填充(颜色过渡三角形)”可能包含了实现上述逻辑的代码...

    图形学填充算法

    这个类可以创建一个可调整大小和形状的矩形或椭圆的追踪器,使用户在绘制图形时能看到实时的边界框。你可以根据需求定制CRectTracker的行为,使其适应封闭路径的追踪。 综上所述,实现“图形学填充算法”需要掌握...

    用vc6做的鼠标点击图形填充

    2. **图形绘制**:MFC的`CDC`(Device Context)类提供了绘制图形的方法,如`MoveTo`、`LineTo`、`Polygon`等。用户定义的顶点列表可以通过`Polygon`函数绘制为一个多边形的轮廓。同时,`CDC`也提供了`FillPolygon`...

    计算机图形学 边填充算法实现代码

    在计算机图形学中,边填充算法是一种常见的技术,用于在屏幕上填充特定区域,例如绘制图形、填充颜色或进行图像处理。这个算法在游戏开发、可视化软件、图形编辑工具等应用中都有广泛的应用。 边填充算法的实现通常...

    计算机图形学 C#(鼠标点击绘制多边形、射线填充、扫描线种子填充、简单种子填充)

    简单种子填充,也称为4邻域或8邻域填充,是图形填充的直观方法。从一个已知的“种子”像素开始,检查它的相邻像素是否在多边形内部。如果是,就将这些像素标记为填充并继续检查它们的相邻像素。这个过程会递归地填充...

    VB 图形的填充的实例

    Picture Box通常用于显示图片或绘制自定义图形,而Form本身也可以作为一个画布来绘制图形。对于填充图形,我们主要会用到GDI+(Graphics Device Interface plus)图形库,它为VB提供了丰富的图形绘制功能。 要填充...

    vb绘制简单图形的代码

    首先,我们需要导入`System.Drawing`命名空间,它包含了绘制图形所需的类和方法。在VB代码的开头添加以下语句: ```vb Imports System.Drawing ``` 1. **五角星绘制**: 五角星的绘制可以通过计算坐标点并连接...

    计算机图形学边填充算法与图形的裁剪

    计算机图形学是信息技术领域的一个重要分支...理解并熟练掌握这些算法,对于从事图形编程、游戏开发或相关领域的专业人士来说,是必不可少的技能。通过不断实践和优化,我们可以创造出更加生动、真实的计算机图形世界。

Global site tag (gtag.js) - Google Analytics