本例子是简单的在WinForm程序中实现在坐标系中绘制直线方程,抛物线方程,点。重新学习解析几何方面的知识。仅供学习分享使用,如有不足之处,还请指正。
涉及知识点:
- 直线方程的表达方式:一般表达式Ax+By+C=0
- 抛物线表达式:y=Ax2+Bx+C
- 坐标转换:由于WinForm中的坐标原点是左上角,数学二维坐标系的原点是在中间,所以需要转换
- 单位转换:WinForm的单位是Pixls,但坐标系的单位不是,需要进行缩放。
- 画图方法:程序中使用GDI+进行画图。
----------------------------------------------------------------------------------------------------------------------
效果图
如下:
---------------------------------------------------------------------------------------------------------
多边形扩展
【如下图所示】
//求多边形对应的边的平行线,然后再求相邻平行线的交点,连起来即是扩展多边形
核心算法
主要代码如下:
【方程类】
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DemoGeometry 7 { 8 /// <summary> 9 /// 方程基类 10 /// </summary> 11 public abstract class Equation 12 { 13 public int A { get; set; } 14 public int B { get; set; } 15 public int C { get; set; } 16 17 /// <summary> 18 /// 判断是否有效 19 /// </summary> 20 /// <returns></returns> 21 public abstract bool IsValid(); 22 23 /// <summary> 24 /// 通过Y值获取x值 25 /// </summary> 26 /// <param name="y"></param> 27 /// <returns></returns> 28 public abstract float GetValueFromY(float y); 29 /// <summary> 30 /// 通过X获取Y值 31 /// </summary> 32 /// <param name="x"></param> 33 /// <returns></returns> 34 public abstract float GetValueFromX(float x); 35 } 36 37 /// <summary> 38 /// 直线方程类一般式:Ax+By+C=0(A、B不同时为0)【适用于所有直线】 39 /// </summary> 40 public class LinearEquation:Equation 41 { 42 /// <summary> 43 /// 通过X值得到Y值 44 /// </summary> 45 /// <param name="x"></param> 46 /// <returns></returns> 47 public override float GetValueFromX(float x) 48 { 49 if (B == 0) 50 { 51 return float.MaxValue; 52 } 53 return -A * x * 1.0f / B - C * 1.0f / B; 54 } 55 56 public override float GetValueFromY(float y) 57 { 58 if (A == 0) 59 { 60 return float.MaxValue; 61 } 62 return -B * y * 1.0f / A - C * 1.0f / A; 63 } 64 65 /// <summary> 66 /// 判断是否有效方程 67 /// </summary> 68 /// <returns></returns> 69 public override bool IsValid() 70 { 71 bool flag = true; 72 if (A == 0 && B == 0) 73 { 74 flag = false; 75 } 76 return flag; 77 } 78 79 public override string ToString() 80 { 81 return string.Format("{0}x+{1}y+{2}=0", A, B, C); 82 } 83 } 84 85 /// <summary> 86 /// 抛物线方程表达式 y=ax2+bx+c 87 /// </summary> 88 public class ParabolicEquation:Equation 89 { 90 91 /// <summary> 92 /// 判断是否有效的方程 93 /// </summary> 94 /// <returns></returns> 95 public override bool IsValid() 96 { 97 //A 不得等于0 98 return A != 0; 99 } 100 101 /// <summary> 102 /// 通过X值得到Y值 103 /// </summary> 104 /// <param name="x"></param> 105 /// <returns></returns> 106 public override float GetValueFromX(float x) 107 { 108 double y = A * Math.Pow(x, 2) + B * x + C; 109 return float.Parse(y.ToString()); 110 } 111 112 public override float GetValueFromY(float y) 113 { 114 return 0.0f; 115 } 116 } 117 }
【控件类】
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Drawing; 5 using System.Data; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace DemoGeometry 11 { 12 /// <summary> 13 /// 坐标系控件 14 /// </summary> 15 public partial class AxisControl : UserControl 16 { 17 #region 属性 18 19 private Axis _AxisX = new Axis() { XName = "x" }; 20 /// <summary> 21 /// X轴 22 /// </summary> 23 public Axis AxisX { get { return this._AxisX; } } 24 25 private Axis _AxisY = new Axis() { XName = "y" }; 26 /// <summary> 27