00001 #region --- License --- 00002 /* Licensed under the MIT/X11 license. 00003 * Copyright (c) 2006-2008 the OpenTK Team. 00004 * This notice may not be removed from any source distribution. 00005 * See license.txt for licensing detailed licensing details. 00006 * 00007 * Contributions by Georg W�chter. 00008 */ 00009 #endregion 00010 00011 using System; 00012 using System.Collections.Generic; 00013 using System.Text; 00014 00015 namespace OpenTK 00016 { 00020 [Serializable] 00021 public struct BezierCurveQuadric 00022 { 00023 #region Fields 00024 00028 public Vector2 StartAnchor; 00029 00033 public Vector2 EndAnchor; 00034 00038 public Vector2 ControlPoint; 00039 00047 public float Parallel; 00048 00049 #endregion 00050 00051 #region Constructors 00052 00059 public BezierCurveQuadric(Vector2 startAnchor, Vector2 endAnchor, Vector2 controlPoint) 00060 { 00061 this.StartAnchor = startAnchor; 00062 this.EndAnchor = endAnchor; 00063 this.ControlPoint = controlPoint; 00064 this.Parallel = 0.0f; 00065 } 00066 00074 public BezierCurveQuadric(float parallel, Vector2 startAnchor, Vector2 endAnchor, Vector2 controlPoint) 00075 { 00076 this.Parallel = parallel; 00077 this.StartAnchor = startAnchor; 00078 this.EndAnchor = endAnchor; 00079 this.ControlPoint = controlPoint; 00080 } 00081 00082 #endregion 00083 00084 #region Functions 00085 00091 public Vector2 CalculatePoint(float t) 00092 { 00093 Vector2 r = new Vector2(); 00094 float c = 1.0f - t; 00095 00096 r.X = (c * c * StartAnchor.X) + (2 * t * c * ControlPoint.X) + (t * t * EndAnchor.X); 00097 r.Y = (c * c * StartAnchor.Y) + (2 * t * c * ControlPoint.Y) + (t * t * EndAnchor.Y); 00098 00099 if (Parallel == 0.0f) 00100 return r; 00101 00102 Vector2 perpendicular = new Vector2(); 00103 00104 if (t == 0.0f) 00105 perpendicular = ControlPoint - StartAnchor; 00106 else 00107 perpendicular = r - CalculatePointOfDerivative(t); 00108 00109 return r + Vector2.Normalize(perpendicular).PerpendicularRight * Parallel; 00110 } 00111 00117 private Vector2 CalculatePointOfDerivative(float t) 00118 { 00119 Vector2 r = new Vector2(); 00120 00121 r.X = (1.0f - t) * StartAnchor.X + t * ControlPoint.X; 00122 r.Y = (1.0f - t) * StartAnchor.Y + t * ControlPoint.Y; 00123 00124 return r; 00125 } 00126 00134 public float CalculateLength(float precision) 00135 { 00136 float length = 0.0f; 00137 Vector2 old = CalculatePoint(0.0f); 00138 00139 for (float i = precision; i < (1.0f + precision); i += precision) 00140 { 00141 Vector2 n = CalculatePoint(i); 00142 length += (n - old).Length; 00143 old = n; 00144 } 00145 00146 return length; 00147 } 00148 00149 #endregion 00150 } 00151 }
1.6.1