コード例 #1
0
        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;
                    }
                }
            }
        }
コード例 #2
0
 private void ChangeVertexPosition(CanvasData canvasData)
 {
     canvasData.polygons[canvasData.activePolygon].vertices[canvasData.clickedVertexIndex] = canvasData.clickCoordinates;
 }
コード例 #3
0
 public void Change(CanvasData canvasData)
 {
     AddVertexToPolygon(canvasData.polygons[canvasData.activePolygon].vertices, canvasData.clickCoordinates);
 }
コード例 #4
0
        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;
        }
コード例 #5
0
 public void Change(CanvasData canvasData)
 {
     ChangeVertexPosition(canvasData);
 }
コード例 #6
0
 public void Change(CanvasData parameters)
 {
     return;
 }
コード例 #7
0
ファイル: Map.cs プロジェクト: soeminnminn/BattleCity
            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);
                        }
                    }
                }
            }
コード例 #8
0
 public void Change(CanvasData canvasData)
 {
     MovePolygon(canvasData);
 }
コード例 #9
0
ファイル: ActionController.cs プロジェクト: HitLuca/ProjectAI
 public void SetCanvasData(CanvasData canvasData)
 {
     this.canvasData = canvasData;
 }
コード例 #10
0
        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();
        }