1 using System.Collections.Generic;
19 internal const int FirstControldPoint = 2;
20 internal const int SecordControlPoint = 3;
26 private const double ControlPointCircleRadius = 2.0;
35 public Point? FirstWorldControlPoint {
get {
return firstWorldControlPoint; } }
49 public Point? SecondWorldControlPoint {
get {
return secondWorldControlPoint; } }
59 internal override bool IsLaneDefined
63 return base.IsLaneDefined && firstWorldControlPoint.HasValue && secondWorldControlPoint.HasValue;
70 internal override bool IsSomePointBeingDragged
74 return base.IsSomePointBeingDragged || isFirstControlPointBeingDragged || secondControlPointIsMoving;
88 internal override void RenderBuildingLane(Point cursorPointOnCanas)
90 if (startWorldPoint.HasValue)
92 if (endWorldPoint.HasValue)
94 lastCursorPointOnCanvas = cursorPointOnCanas;
95 if (firstWorldControlPoint.HasValue)
97 if (secondWorldControlPoint.HasValue)
99 using (DrawingContext dc = visual.RenderOpen())
102 .GetBezierCurveGeometry(TransformRealWorldPoint(startWorldPoint.Value),
103 TransformRealWorldPoint(endWorldPoint.Value),
104 TransformRealWorldPoint(firstWorldControlPoint.Value),
105 TransformRealWorldPoint(secondWorldControlPoint.Value)));
106 dc.DrawEllipse(Brushes.Green, null,
107 TransformRealWorldPoint(firstWorldControlPoint.Value), ControlPointCircleRadius,
108 ControlPointCircleRadius);
109 dc.DrawEllipse(Brushes.Green, null,
110 TransformRealWorldPoint(secondWorldControlPoint.Value), ControlPointCircleRadius,
111 ControlPointCircleRadius);
114 dc.DrawEllipse(null, pen, TransformRealWorldPoint(startWorldPoint.Value),
115 DraggingCircleRadius, DraggingCircleRadius);
116 dc.DrawEllipse(null, pen, TransformRealWorldPoint(endWorldPoint.Value),
117 DraggingCircleRadius, DraggingCircleRadius);
118 dc.DrawEllipse(null, pen, TransformRealWorldPoint(firstWorldControlPoint.Value),
119 DraggingCircleRadius, DraggingCircleRadius);
120 dc.DrawEllipse(null, pen, TransformRealWorldPoint(secondWorldControlPoint.Value),
121 DraggingCircleRadius, DraggingCircleRadius);
127 using (DrawingContext dc = visual.RenderOpen())
130 .GetBezierCurveGeometry(TransformRealWorldPoint(startWorldPoint.Value),
131 TransformRealWorldPoint(endWorldPoint.Value),
132 TransformRealWorldPoint(firstWorldControlPoint.Value), cursorPointOnCanas));
133 dc.DrawEllipse(Brushes.Green, null,
134 TransformRealWorldPoint(firstWorldControlPoint.Value), ControlPointCircleRadius,
135 ControlPointCircleRadius);
141 using (DrawingContext dc = visual.RenderOpen())
144 TransformRealWorldPoint(startWorldPoint.Value),
145 TransformRealWorldPoint(endWorldPoint.Value), cursorPointOnCanas, cursorPointOnCanas));
151 base.RenderBuildingLane(cursorPointOnCanas);
160 internal override void SetPoint(Point cursorPointOnCanvas)
162 if (firstWorldControlPoint.HasValue)
164 Debug.Assert(!secondWorldControlPoint.HasValue,
"Incorrect application state");
165 secondWorldControlPoint = TransformCanvasPoint(cursorPointOnCanvas);
166 RenderBuildingLane(cursorPointOnCanvas);
168 else if (endWorldPoint.HasValue)
170 firstWorldControlPoint = TransformCanvasPoint(cursorPointOnCanvas);
171 RenderBuildingLane(cursorPointOnCanvas);
175 base.SetPoint(cursorPointOnCanvas);
182 internal override void ResetRendererAndClearAnyPreview()
184 firstWorldControlPoint = secondWorldControlPoint = null;
185 base.ResetRendererAndClearAnyPreview();
191 internal override void ResetDraggingOfPoint()
193 base.ResetDraggingOfPoint();
194 isFirstControlPointBeingDragged = secondControlPointIsMoving =
false;
201 internal override void MovePointOfLane(Point point)
203 firstWorldControlPoint += GetVectorOfMoveOfPointIfItIsBeingDragged(point, isFirstControlPointBeingDragged);
204 secondWorldControlPoint += GetVectorOfMoveOfPointIfItIsBeingDragged(point, secondControlPointIsMoving);
205 base.MovePointOfLane(point);
212 internal override void InitializeDraggingModeOfAPointIfAnyIsNear(Point cursorPointOnCanvas)
214 base.InitializeDraggingModeOfAPointIfAnyIsNear(cursorPointOnCanvas);
215 IList<double> squaredDistancesOfCanvasPointToWorldLanePoints =
216 GetSquaredDistancesOfCanvasPointToWorldLanePoints(cursorPointOnCanvas);
217 SetPointToDraggingModeIfCursorIsNearAndDragging(ref isFirstControlPointBeingDragged, cursorPointOnCanvas,
218 squaredDistancesOfCanvasPointToWorldLanePoints[
BezierLanePoints.FirstControldPoint],
219 squaredDistancesOfCanvasPointToWorldLanePoints);
220 SetPointToDraggingModeIfCursorIsNearAndDragging(ref secondControlPointIsMoving, cursorPointOnCanvas,
221 squaredDistancesOfCanvasPointToWorldLanePoints[
BezierLanePoints.SecordControlPoint],
222 squaredDistancesOfCanvasPointToWorldLanePoints);
232 return base.GetSquaredDistancesOfCanvasPointToWorldLanePoints(canvasPoint).Concat(
235 (canvasPoint - TransformRealWorldPoint(firstWorldControlPoint.Value)).LengthSquared,
236 (canvasPoint - TransformRealWorldPoint(secondWorldControlPoint.Value)).LengthSquared
Renderer for drawing bezier lanes during their building.
Point secondWorldControlPoint
The second control point of a previewing building lane.
bool isFirstControlPointBeingDragged
Determines whether the firstWorldControlPoint is currently being dragged.
Renderer for drawing lanes during their building.
Assigns integer identifiers for additional points of a bezier lane.
bool secondControlPointIsMoving
Determines whether the secondWorldControlPoint is currently being dragged.
Assigns integer identifiers for each point of a lane.
Class for creating geometry with bezier curve from canvas-coordinated points.
override IList< double > GetSquaredDistancesOfCanvasPointToWorldLanePoints(Point canvasPoint)
Get squared distances of all lane world points from cursor point on canvas.
Point firstWorldControlPoint
The first control point of a previewing building lane.