public static void ScanLineFillVertexSort(PaintEventArgs e, CanvasData canvasData) { List <Vertex> polygonVertexes = new List <Vertex>(); for (int i = 0; i < canvasData.polygons[canvasData.activePolygon].vertices.Count; i++) { polygonVertexes.Add(new Vertex(canvasData.polygons[canvasData.activePolygon].vertices[i], i)); } polygonVertexes = polygonVertexes.OrderBy(v => v.point.Y).ToList(); int yMin = polygonVertexes[0].point.Y, yMax = polygonVertexes.Last().point.Y; List <AETData> AET = new List <AETData>(); for (int y = yMin + 1; y < yMax; y++) { List <Vertex> vertexesLyingOnScanLine = polygonVertexes.FindAll(vertex => vertex.point.Y == (y - 1)); foreach (Vertex vertex in vertexesLyingOnScanLine) { int previousVertexIndex = MathMod(vertex.index - 1, polygonVertexes.Count); Vertex previousVertex = polygonVertexes.Find(x => x.index == previousVertexIndex); if (previousVertex.point.Y >= vertex.point.Y) { double mInverse = ((double)previousVertex.point.X - (double)vertex.point.X) / ((double)previousVertex.point.Y - (double)vertex.point.Y); //mInverse = double.IsInfinity(mInverse) ? 0 : mInverse; AET.Add(new AETData { yMax = previousVertex.point.Y, x = vertex.point.X, mInverse = mInverse, firstVertexIndex = previousVertexIndex, secondVertexIndex = vertex.index }); } else { AET.RemoveAll(x => (x.firstVertexIndex == vertex.index && x.secondVertexIndex == previousVertexIndex) || (x.firstVertexIndex == previousVertexIndex && x.secondVertexIndex == vertex.index)); } int nextVertexIndex = MathMod(vertex.index + 1, polygonVertexes.Count); Vertex nextVertex = polygonVertexes.Find(x => x.index == nextVertexIndex); if (nextVertex.point.Y >= vertex.point.Y) { double mInverse = ((double)nextVertex.point.X - (double)vertex.point.X) / ((double)nextVertex.point.Y - (double)vertex.point.Y); //mInverse = double.IsInfinity(mInverse) ? 0 : mInverse; AET.Add(new AETData { yMax = nextVertex.point.Y, x = vertex.point.X, mInverse = mInverse, firstVertexIndex = nextVertexIndex, secondVertexIndex = vertex.index }); } else { AET.RemoveAll(x => (x.firstVertexIndex == vertex.index && x.secondVertexIndex == nextVertexIndex) || (x.firstVertexIndex == nextVertexIndex && x.secondVertexIndex == vertex.index)); } } AET.OrderBy(x => x.x); for (int i = 0; i < AET.Count / 2; i++) { e.Graphics.DrawLine(new Pen(Color.Yellow), new Point((int)AET[2 * i].x, y), new Point((int)AET[2 * i + 1].x, y)); } for (int i = 0; i < AET.Count; i++) { AET[i].x += AET[i].mInverse; if (double.IsInfinity(AET[i].mInverse)) { AET[i].x = polygonVertexes[AET[i].secondVertexIndex].point.X; } } } }
private void ChangeVertexPosition(CanvasData canvasData) { canvasData.polygons[canvasData.activePolygon].vertices[canvasData.clickedVertexIndex] = canvasData.clickCoordinates; }
public void Change(CanvasData canvasData) { AddVertexToPolygon(canvasData.polygons[canvasData.activePolygon].vertices, canvasData.clickCoordinates); }
public static void Canvas(int controlId, Rect rect, ref Vector2 cameraPosition, ref float zoom, float[] zoomLevels = null) { zoomLevels = zoomLevels ?? kZoomScrollLevels; CanvasData canvasData; if (!s_CanvasDatas.TryGetValue(controlId, out canvasData)) { canvasData = new CanvasData { cameraPositionTarget = cameraPosition, zoomTarget = zoom }; s_CanvasDatas[controlId] = canvasData; } var evt = Event.current; switch (evt.GetTypeForControl(controlId)) { case EventType.MouseDown: if (evt.button == 2 && rect.Contains(evt.mousePosition)) { EditorGUIUtility.hotControl = controlId; EditorGUIUtility.keyboardControl = 0; canvasData.panning = true; canvasData.zooming = false; evt.Use(); } break; case EventType.MouseDrag: if (evt.button == 2 && EditorGUIUtility.hotControl == controlId) { cameraPosition += evt.delta; evt.Use(); } break; case EventType.MouseUp: if (evt.button == 2 && EditorGUIUtility.hotControl == controlId) { EditorGUIUtility.hotControl = 0; canvasData.panning = false; canvasData.zooming = false; evt.Use(); } break; case EventType.ScrollWheel: { canvasData.zooming = true; var oldZoomTarget = canvasData.zoomTarget; canvasData.zoomTarget = IncrementZoomLevel(canvasData.zoomTarget, evt.delta.y > 0 ? -1 : 1, zoomLevels); if (!Mathf.Approximately(canvasData.zoomTarget, oldZoomTarget)) { var ratio = canvasData.zoomTarget / oldZoomTarget; var mousePositionRectSpace = evt.mousePosition - rect.position; var mousePositionCanvasSpace = mousePositionRectSpace - canvasData.cameraPositionTarget; canvasData.cameraPositionTarget += mousePositionCanvasSpace * (1 - ratio); } evt.Use(); break; } case EventType.Repaint: { DrawGrid(rect, cameraPosition, zoom); break; } } if (canvasData.zooming) { if (Mathf.Abs(canvasData.zoomTarget - zoom) < 0.0001f) { zoom = canvasData.zoomTarget; cameraPosition = canvasData.cameraPositionTarget; canvasData.zooming = false; } else { var deltaTime = Mathf.Min(Time.realtimeSinceStartup - canvasData.lastUpdateTime, 0.1f); zoom = Mathf.Lerp(zoom, canvasData.zoomTarget, deltaTime * kLerpSpeed); cameraPosition = Vector2.Lerp(cameraPosition, canvasData.cameraPositionTarget, deltaTime * kLerpSpeed); } } else { canvasData.zoomTarget = zoom; canvasData.cameraPositionTarget = cameraPosition; } s_CanvasDatas[controlId] = canvasData; }
public void Change(CanvasData canvasData) { ChangeVertexPosition(canvasData); }
public void Change(CanvasData parameters) { return; }
private void Load(XmlElement xElement) { if (xElement == null) return; if (xElement.Name != StateData.c_root) return; if (!xElement.HasChildNodes) return; if (this.m_enemys == null) this.m_enemys = new List<EnemyData>(); XmlElement canvas = null; XmlElement enemys = null; foreach (XmlNode child in xElement.ChildNodes) { if (child.Name == "canvas") { if (canvas == null) canvas = (XmlElement)child; } else if (child.Name == "enemy") { if (enemys == null) enemys = (XmlElement)child; } } if (canvas != null) this.m_canvas = new CanvasData(canvas); if (enemys != null) { string sTank = ""; string sBonus = ""; string sType = ""; foreach (XmlNode enemyChild in enemys.ChildNodes) { if (enemyChild.Name == "tank") { sTank = enemyChild.InnerText; } else if (enemyChild.Name == "bonus") { sBonus = enemyChild.InnerText; } else if (enemyChild.Name == "type") { sType = enemyChild.InnerText; } } short[] iTank = this.GetValueList(sTank); short[] iBonus = this.GetValueList(sBonus); short[] iType = this.GetValueList(sType); if (iTank != null) { for (int i = 0; i < iTank.Length; i++) { short num1 = 0; short num2 = 0; if ((iBonus != null) && (iBonus.Length > i)) { num1 = iBonus[i]; } if ((iType != null) && (iType.Length > i)) { num2 = iType[i]; } EnemyData data = new EnemyData(iTank[i], num1, num2); this.m_enemys.Add(data); } } } }
public void Change(CanvasData canvasData) { MovePolygon(canvasData); }
public void SetCanvasData(CanvasData canvasData) { this.canvasData = canvasData; }
private CanvasData GetBehaviorAndCanvasData(CanvasData canvasData, Point clickCoordinates, InputMode clickMode = InputMode.SingleLeftClick) { if (clickMode == InputMode.SingleLeftClick) { int clickedVertexIndex = -1; if ((clickedVertexIndex = Algorithms.FindIfClickedNearVertex(canvasData, clickCoordinates)) == -1) { Tuple <int, int> edge = new Tuple <int, int>(-1, -1); if ((edge = Algorithms.FindIfClickedNearEdge(canvasData, clickCoordinates)).Equals(new Tuple <int, int>(-1, -1))) { return new CanvasData(canvasData) { behaviourMode = BehaviourMode.VertexAdd, clickCoordinates = clickCoordinates } } ; else { return new CanvasData(canvasData) { behaviourMode = BehaviourMode.EdgeVertexAdd, clickedEdge = edge } }; } else { return new CanvasData(canvasData) { behaviourMode = BehaviourMode.VertexDelete, clickedVertexIndex = clickedVertexIndex } }; } if (clickMode == InputMode.CtrlPressed) { int clickedVertexIndex = -1; if ((clickedVertexIndex = Algorithms.FindIfClickedNearVertex(canvasData, clickCoordinates)) == -1) { if (Algorithms.CheckIfClickedInsideBoundingBox(Polygon.GetBoundingBox(canvasData.polygons[canvasData.activePolygon].vertices), clickCoordinates)) { return new CanvasData(canvasData) { behaviourMode = BehaviourMode.PolygonMove, clickCoordinates = clickCoordinates, moveCoordinates = clickCoordinates } } ; else { return new CanvasData(canvasData) { behaviourMode = BehaviourMode.DoNothing } }; } else { return new CanvasData(canvasData) { behaviourMode = BehaviourMode.VertexMove, clickCoordinates = clickCoordinates, clickedVertexIndex = clickedVertexIndex } }; } return(new CanvasData(canvasData) { behaviourMode = BehaviourMode.DoNothing }); } void canvas_MouseMove(object sender, MouseEventArgs e) { HandleMouseMove(canvasData, e.Location); //PaintCanvas(); canvas.Invalidate(); }