【笔记】【C# 二维三维图形绘制工程实例宝典】 第03章 坐标系统和颜色变换

3.1 坐标系统

GDI+定义了三种形式的坐标系统:世界坐标系统页面坐标系统设备坐标系统

测量相对于文档区域左上角的位置和测量相对于屏幕(桌面)左上角的位置之间的区别非常重要,GDI+为它们指定了不同的名称:

  • 世界坐标:用来绘制自然模型的坐标(以像素为单位)。Graphics.Draw*使用的坐标就是该坐标系下的坐标。
  • 页面坐标:要测量的点距离客户区域左上角的位置(以像素为单位)。
  • 设备坐标:设备坐标类似于页面坐标,但其测量单位不一定是像素,而是用户通过调用Graphics.PageUnit属性指定的单位。

GDI+在设备绘图表面(如屏幕,打印机)绘制图形之前,图形的坐标系统要经过几步变换

  • 第一步变换世界坐标到页面坐标,这一变换过程称为世界变换。
  • 第二步变换页面坐标到设备坐标,这一变换过程称为页面变换。设备坐标代表绘制的图形时怎样显示在设备上的。

在GDI+中,所有三种坐标系统的起始原点均是客户区左上角原点(0,0)。当画一条从点A(0,0)到点B(120,80)的直线时,该直线的起始点是左上角X方向的0像素点和Y方向的0像素点,终点是X方向的120像素点和Y方向的80像素点。以下程序展示了应用世界坐标系统在窗体上绘制一条从点A(0,0)到点B(120,80)的直线。此时,世界坐标系统与页面坐标系统重合。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;

namespace Example
{
    public partial class Form1 : Form
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(332, 266);
            this.Name = "Form1";
            this.Text = "Form1";
            
            this.ResumeLayout(false);

        }
		
        public Form1()
        {
            InitializeComponent();

            this.AutoScaleDimensions = new Size(5, 13);
            this.ClientSize = new Size(392, 373);
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 
        }


        protected override void OnPaint(PaintEventArgs e)
        {
            // 获取绘图对象
            Graphics g = e.Graphics;

            // 设置垂直方向字体
            Font vertFont = new Font("Verdana", 10, FontStyle.Regular);
            // 设置水平方向字体
            Font horzFont = new Font("Verdana", 10, FontStyle.Regular);
            // 设置画刷
            SolidBrush blackBrush = new SolidBrush(Color.Black);
            // 设置黑色画笔
            Pen blackPen = new Pen(Color.Black, 1);
            // 设置蓝色画笔
            Pen bluePen = new Pen(Color.Blue, 1);

            //页面坐标
            //绘制X轴标签

            g.DrawString("200", horzFont, blackBrush, 200, 5);
            g.DrawString("100", horzFont, blackBrush, 100, 5);
            g.DrawString("X", horzFont, blackBrush, 250, 0);

            //Drawing vertical string
            StringFormat vertStrFormat= new StringFormat();
            vertStrFormat.FormatFlags = StringFormatFlags.DirectionVertical;
            //绘制Y轴标签
            g.DrawString("100", vertFont, blackBrush, 0, 100);
            g.DrawString("200", vertFont, blackBrush, 0, 200);
            g.DrawString("Y", vertFont, blackBrush, 0, 250);
			
            //绘制坐标轴
            g.DrawLine(blackPen, 0, 0, 0, 250);
            g.DrawLine(blackPen, 0, 0, 250, 0);

            // 绘制直线
            Point A = new Point(0, 0);
            Point B = new Point(120, 80);
            g.DrawLine(bluePen, A, B);
        }
    }
}

现将世界坐标系统的原点从点(0,0)偏移到点(50,40),应用Graphics类中的TranslateTransform方法实现原点的偏移。

  • 世界坐标系统中,该直线仍是起始于点(0,0)终止于点(120,80),
  • 页面坐标系统中该直线是起始于点(50,40)终止于点(120 + 50 = 170, 80 + 40 = 120)
protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;
    g.PageUnit = GraphicsUnit.Inch;
    g.DrawLine(Pens.Black, 0,0,2,1);
}

在上述的代码段中,首先将PageUnit属性值设置为英寸,然后画一条从点(0,0)到点(2,1)的直线。这条直线在世界和页面坐标系统中起始于点(0,0)终止于点(2,1),但是在设备坐标中,该直线起始于点(0,0)终止于点(192,96)(假设屏幕的解析度是每英寸96个点)。注意,画笔此时的默认宽度为1个页面单位,即1个英寸宽。当然,也可重新定义笔的宽度。

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;
    Pen redPen = new Pen(Color.Red, 1/g.Dpix);
    g.PageUnit = GraphicsUnit.Inch;
    g.DrawLine(redPen, 0,0,2,1);
}

3.2 颜色变换

GDI+提供用于存储和处理图形图像的Image类和Bitmap类,Image对象和Bitmap对象将每个像素的颜色都存储为32位的数:红色、绿色、蓝色和Alpha个占8位。这四个分量的值都是0到255。在红色、绿色、蓝色分量中,0标识没有亮度,255标识最大亮度。Alpha分量指定颜色的透明度,0表示完全透明,255表示完全不透明。颜色矢量采用四元组形式(红色、绿色、蓝色、Alpha)。因此可用以下颜色矩阵来修改该颜色分量。

             | Red    0       0       0     |
             | 0      Green   0       0     |
             | 0      0       Blue    0     |
             | 0      0       0       Alpha |

表示颜色的另一种管理是用数字1表示亮度达到最大,GDI+在进行颜色变换时使用以1表示最大亮度的管理。例如,改变颜色(0,255,0,255)到半透明,方法就是用50%替代上述4x4颜色变换矩阵中的Alpha的初始值。相关的计算矩阵如下所示:

                 | 1    0   0    0   |
                 | 0    1   0    0   |
|0 255 0 255| x  |                   | = |0 255 0 127.5|
                 | 0    0   1    0   |
                 | 0    0   0    0.5 |

上述是通过4x4的颜色变换矩阵进行线性变换。要支持非线性变换,需要将4x4的线性颜色变换矩阵扩展为5x5的仿射颜色变换矩阵。

             | Red    0       0       0      0 |
             | 0      Green   0       0      0 |
             | 0      0       Blue    0      0 |
             | 0      0       0       Alpha  0 |
             | 0      0       0       0      1 |

例如,假设颜色适量为(25,100,100,255),须同事完成两个操作:

  • 将红色元素的值加倍
  • 将绿色元素的值加100
                     | 2   0    0    0  0 |
                     | 0   1    0    0  0 |
|25 100 100 255 1| x | 0   0    1    0  0 | = |50 200 100 255 1|
                     | 0   0    0    1  0 |
                     | 0   100  0    0  1 |

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第2章 图形基础 34 2.1 笔和画刷 34 2.1.1 pen 类 34 2.1.2 brush 类 35 2.2 基本图形形状 37 2.2.1 点 37 2.2.2 直线和曲线 37 2.2.3 矩形、椭圆形和圆弧形 40 2.2.4 多边形 42 2.3 颜色 44 2.4 双倍缓存 66 第3章 坐标系统颜色变换 69 3.1 坐标系统 69 3.2 颜色变换 77 第二部分 二维图形的基本算法 第4章 二维矩阵和变换 82 4.1 矩阵基础和变换 82 4.2 齐次坐标 82 4.2.1 齐次坐标中的缩放 83 4.2.2 齐次坐标中的平移 83 4.2.3 齐次坐标中的旋转 84 4.2.4 变换组合 85 4.2.5 c#中矩阵的定义 86 4 .2.6 c#中的矩阵操作 87 4.2.7 c#中基本的矩阵变换 89 4.3 c#图形对象的变换 93 基本变换 93 4.4 c#中的多对象变换 101 4.5 文字变换 105 第5章 二维线形图形 109 5.1 序列化和反序列化及二维图形的基本框架 109 5.1.1 c#序列化和反序列化 110 5.1.2 二维图形的基本框架 113 5.2 二维图形 248 5.2.1 简单实例 248 5.2.2 图例 278 5.2.3 符号 289 5.2.4 对数比例 302 5.2.5 图形的修饰 308 5.3 阶梯状图 316 5.4 多y轴图 318 第6章 特殊二维图形 327 6.1 创建柱状图 327 6.1.1 水平柱状图 327 6.1.2 垂直柱状图 343 6.1.3 图形充填柱状图 344 6.1.4 重叠柱状图 346 6.2 饼状图 348 6.3 误差图 361 6.4 股票图 367 6.4.1 最高最低收盘价股票图 368 6.4.2 最高最低开盘收盘价股票图 369 6.4.3 最高最低价股票图 377 6.4.4 k 线图(阴阳烛图) 380 6.5 面积图 389 6.6 综合图 390 第三部分 三维图形的相关知识及三维图形的实现 第7章 三维矩阵和变换 396 7.1 三维数学概念 396 7.1.1 操作三维对象 396 7.1.2 数学结构 397 7.2 三维中的基本矩阵和变换 402 7.2.1 c#三维点和矩阵的操作 403 7.2.2 三维的基本变换 405 7.3 方位角和仰角 434 7.4 三维图形中的特殊坐标系统 439 7.4.1 球坐标系统 440 7.4.2 圆柱坐标系统 443 7.5 特殊坐标中的实际应用 447 7.5.1 球坐标示例 447 7.5.2 双缓存 463 第8章 三维图形 473 8.1 三维图形基础 473 8.1.1 point3和matrix3类 473 8.1.2 chartstyle类 476 8.1.3 坐标轴 496 8.1.4 网格线 496 8.1.5 标签 497 8.2 三维折线图 503 8.3 三维图形函数包 508 8.3.1 chartstyle2d类 509 8.3.2 point4类 515 8.3.3 dataseries类 516 8.3.4 chartfunctions类 521 8.3.5 drawchart类 526 8.4 曲面图的实现 541 8.4.1 网格图 541 8.4.2 幕布网格图 548 8.4.3 瀑布网格图 551 8.4.4 曲面图 553 8.5 x-y平面色彩图 559 8.6 轮廓图 564 8.6.1 轮廓图的算法 564 8.6.2 轮廓图的实现 564 8.7 组合图 569 8.7.1 三维体系中的x-y色彩图 570 8.7.2 三维体系中的轮廓图 571 8.7.3 网格-轮廓组合图 575 8.7.4 曲面-轮廓组合图 576 8.7.5 填充曲面-轮廓组合图 576 8.8 三维柱状图 577 实现柱状图 577 8.9 切片图 591 切片图的实现 591 第四部分 c#中应用微软office的excel实现各种二维及三维图形 第9章 应用程序中的excel图表 600 9.1 excel和c#间的互操作 600 9.2 c#应用程序中的excel图表示例 602 9.2.1 excel图表对象模型 602 9.2.2 创建独立的excel图表 604 9.2.3 创建嵌入式excel图表 607 9.3 更多的excel图表 608 9.3.1 柱状图 608 9.3.2 饼状图 611 9.3.3 面积图 613 9.3.4 圆环图 615 9.3.5 雷达图 615 9.3.6 股价图 617 9.3.7 曲面图 619 9.3.8 颜色映射 622 9.4 整合excel图表到windows forms应用程序中 627 9.4.1 windows窗体上的独立excel图表 627 9.4.2 windows窗体上的嵌入式excel图表 631 第五部分 实现文件的相关知识 第10章 文件的读/写 634 10.1 c#文件读/写常用类 634 10.1.1 system.io.file类和system.io.fileinfo类 634 10.1.2 system.io.directory类和system.directoryinfo类 637 10.2 c#基于流的输入/输出 639 流的继承结构 640 10.3 文件读/写操作涉及的类 643 10.4 一些常见的问题及其解决 方案 643

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhy29563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值