예제 #1
0
 public static void Main(string[] args)
 {
     ColoredPoint obj  = new ColoredPoint(2, 3, "black");
     ColoredLine  obj1 = new ColoredLine(1, 2, 3, 4, "red");
     Line         obj2 = new Line(1, 2, 3, 4);
     PolyLine     obj3 = new PolyLine(1, 2, 3, 4, 5, 6, 7, 8);
 }
예제 #2
0
        public bool AddObject(ColoredPoint octreePoint)
        {
            if (octreePoint == null)
            {
                throw new NullReferenceException("octreePoint");
            }

            if (!CanContainOrIntersect(octreePoint))
            {
                return(false);
            }

            if (!HasChildren() || IsNeedForSplit())
            {
                AddObjectHere(octreePoint);

                if (IsNeedForSplit())
                {
                    CreateChildren();
                    DistributeObjectsToChildren();
                }
            }
            else
            {
                if (!AddObjectToChildren(octreePoint))
                {
                    AddObjectHere(octreePoint);
                }
            }
            return(true);
        }
예제 #3
0
        public bool RemoveObject(ColoredPoint octreePoint)
        {
            if (octreePoint == null)
            {
                throw new NullReferenceException("octreePoint");
            }

            if (!CanContain(octreePoint))
            {
                return(false);
            }

            if (RemoveObjectHere(octreePoint))
            {
                return(true);
            }
            else
            {
                if (!_children.Any())
                {
                    return(false);
                }

                foreach (var child in _children)
                {
                    if (child.RemoveObject(octreePoint))
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
예제 #4
0
        Dictionary <string, int> GetColumnAndRowCounts(List <ColoredPoint> data)
        {
            ColoredPoint p = new ColoredPoint(new System.Drawing.Point(-1, -1), Color.Black);

            int rowCount = 0;
            int ColCount = 0;

            data.ForEach(pnt =>
            {
                if (pnt.X != p.X && p.X < pnt.X)
                {
                    ColCount++;
                    p.X = pnt.X;
                }
                if (pnt.Y != p.Y && p.Y < pnt.Y)
                {
                    rowCount++;
                    p.Y = pnt.Y;
                }
            });

            return(new Dictionary <string, int>()
            {
                { "rows", rowCount }, { "cols", ColCount }
            });
        }
예제 #5
0
    public void BuildTriangle(ColoredPoint v0, ColoredPoint v1, ColoredPoint v2, Vector3 normal)
    {
        int v0Index = verts.Count;
        int v1Index = verts.Count + 1;
        int v2Index = verts.Count + 2;

        // add vertices
        verts.Add(v0.pos);
        verts.Add(v1.pos);
        verts.Add(v2.pos);

        // add a surface normal for each vertex
        normals.Add(normal);
        normals.Add(normal);
        normals.Add(normal);

        // add uvs
        uvs.Add(new Vector2(0, 0));
        uvs.Add(new Vector2(0, 1));
        uvs.Add(new Vector2(1, 1));

        // add colors
        colors.Add(v0.color);
        colors.Add(v1.color);
        colors.Add(v2.color);

        // add indices that point to vertices
        triangleIndices.Add(v0Index);
        triangleIndices.Add(v1Index);
        triangleIndices.Add(v2Index);
    }
 public bool intersect(ColoredPoint p1, ColoredPoint p2, ColoredPoint p3, ColoredPoint p4)
 {
     if (intersectProp(p1, p2, p3, p4))
         return true;
     else if (isBetween(p1, p2, p3) || isBetween(p1, p2, p4) || isBetween(p3, p4, p1) || isBetween(p3, p4, p2))
         return true;
     else return false;
 }
 public void add(ColoredPoint p)
 {
     if (p.IsDuplicate == false)
     {
         vertexColors[(int)p.vertexColor]++;
         size++;
     }
 }
예제 #8
0
 private void AddObjectHere(ColoredPoint octreePoint)
 {
     if (!_pointsDic.ContainsKey(octreePoint.CurrentlyUsedColor))
     {
         _pointsDic.Add(octreePoint.CurrentlyUsedColor, new List <ColoredPoint>());
     }
     _points.Add(octreePoint);
     _pointsDic[octreePoint.CurrentlyUsedColor].Add(octreePoint);
     _modelsInNodes++;
 }
예제 #9
0
    void Update()
    {
        mc.Clear();

        // add vertices
        for (int i = 0; i <= width; i++)
        {
            float x = i * squareSize;
            for (int j = 0; j <= depth; j++)
            {
                float z = j * squareSize;

                // compute noise at given space time point
                float noiseOut = Perlin.Noise(noiseScale.x * i, noiseScale.y * Time.time, noiseScale.z * j);

                // normalize noise
                noiseOut += 1;
                noiseOut /= 2;

                // compute y-value from noise
                float y = noiseOut * maxHeight;

                // compute uv
                float u = (float)i / width;
                float v = (float)j / depth;

                // compute color from noise

                Color color = minColor + noiseOut * (maxColor - minColor);

                // add the vertex
                vertices[i, j] = new ColoredPoint(x, y, z, color.r, color.g, color.b);
            }
        }

        // build triangles out of those vertices
        for (int i = 0; i < width; i++)
        {
            for (int j = 0; j < depth; j++)
            {
                ColoredPoint a = vertices[i, j];
                ColoredPoint b = vertices[i + 1, j];
                ColoredPoint c = vertices[i, j + 1];
                ColoredPoint d = vertices[i + 1, j + 1];

                mc.BuildTriangle(d, b, a);
                mc.BuildTriangle(c, d, a);
            }
        }

        meshFilter.mesh = mc.CreateMesh();
    }
예제 #10
0
        private void InitializePoints(ColoredPoint[] points)
        {
            uint[] args = new uint[5] {
                0, 0, 0, 0, 0
            };
            args[0]          = (uint)entityMesh.GetIndexCount(0);
            args[1]          = (uint)points.Length;
            args[2]          = (uint)entityMesh.GetIndexStart(0);
            args[3]          = (uint)entityMesh.GetBaseVertex(0);
            entityArgsBuffer = new ComputeBuffer(1, args.Length * sizeof(uint), ComputeBufferType.IndirectArguments);
            entityArgsBuffer.SetData(args);

            entityMeshPropertiesBuffer = new ComputeBuffer(points.Length, ColoredPoint.Size());
            entityMeshPropertiesBuffer.SetData(points);
            entityMat.SetBuffer("_Properties", entityMeshPropertiesBuffer);
        }
 public int isInDiagSet2(ColoredPoint a, ColoredPoint b)
 {
     for (int i = 1; i < diagonalSet.Count; i++)
     {
         if (((diagonalSet[i].Start.point.X == a.point.X) &&
           (diagonalSet[i].Start.point.Y == a.point.Y) &&
           (diagonalSet[i].End.point.X == b.point.X) &&
           (diagonalSet[i].End.point.Y == b.point.Y))
           ||
           ((diagonalSet[i].End.point.X == a.point.X) &&
           (diagonalSet[i].End.point.Y == a.point.Y) &&
           (diagonalSet[i].Start.point.X == b.point.X) &&
           (diagonalSet[i].Start.point.Y == b.point.Y)))
             return i;
     }
     return -1;
 }
예제 #12
0
 public int isInDiagSet(ColoredPoint a, ColoredPoint b)
 {
     for (int i = 0; i < diagonalSet.Count; i++)
     {
         if (((diagonalSet[i].getStart().point.X == a.point.X) &&
           (diagonalSet[i].getStart().point.Y == a.point.Y) &&
           (diagonalSet[i].getEnd().point.X == b.point.X) &&
           (diagonalSet[i].getEnd().point.Y == b.point.Y))
           ||
           ((diagonalSet[i].getEnd().point.X == a.point.X) &&
           (diagonalSet[i].getEnd().point.Y == a.point.Y) &&
           (diagonalSet[i].getStart().point.X == b.point.X) &&
           (diagonalSet[i].getStart().point.Y == b.point.Y)))
             return i;
     }
     return -1;
 }
예제 #13
0
        private Octree FindObjectParent(ColoredPoint point)
        {
            Octree toReturn = null;

            if (_points.Any(x => x == point))
            {
                return(this);
            }

            int child = 0;

            while ((toReturn == null) && (child < _children.Count))
            {
                toReturn = _children[child++].FindObjectParent(point);
            }

            return(toReturn);
        }
예제 #14
0
        private bool RemoveObjectHere(ColoredPoint octreePoint, bool merge = true)
        {
            if (!_points.Any())
            {
                return(false);
            }

            int index = _points.IndexOf(octreePoint);

            if (index == -1)
            {
                return(false);
            }

            _pointsDic[octreePoint.CurrentlyUsedColor].Remove(octreePoint);
            RemoveObject(index, merge);
            return(true);
        }
예제 #15
0
        private ColoredPoint[] PointsFromEntityCollection(EntityCollection entities, float height, Vector3 pos)
        {
            if (entities.EntityCount == 0)
            {
                Debug.LogWarning("Trying to draw empty entity collection...");
            }

            ColoredPoint[] points = new ColoredPoint[entities.EntityCount];
            int            index  = 0;

            foreach (IEntity entity in entities.AllEntities)
            {
                points[index].matrix = Matrix4x4.TRS(new Vector3(entity.Position.x - pos.x, height - pos.y, entity.Position.y - pos.z), Quaternion.identity, Vector3.one * entity.Visualization.Size);
                //Debug.Log($"POINT {points[index].matrix}");
                points[index].color = entity.Visualization.Color;
                index++;
            }
            return(points);
        }
예제 #16
0
        private bool AddObjectToChildren(ColoredPoint point)
        {
            if (_children.Any())
            {
                for (int i = 0; i < _children.Count; i++)
                {
                    if (_children[i].CanContain(point))
                    {
                        _children[i].AddObject(point);
                        return(true);
                    }
                }


                var added   = false;
                var counter = 0;
                for (int index = 0; index < _children.Count; index++)
                {
                    if (_children[index].CanContain(point))
                    {
                        counter++;
                    }
                }
                if (counter == _children.Count)
                {
                    return(false);
                }

                for (int index = 0; index < _children.Count; index++)
                {
                    if (_children[index].CanContain(point))
                    {
                        _children[index].AddObject(point);
                        added = true;
                    }
                }
                return(added);
            }
            return(false);
        }
 bool LeftOn(ColoredPoint p1, ColoredPoint p2, ColoredPoint p3)
 {
     return Area2(p1, p2, p3) >= 0;
 }
 bool isCollinear(ColoredPoint p1, ColoredPoint p2, ColoredPoint p3)
 {
     return Area2(p1, p2, p3) == 0;
 }
 bool isBetween(ColoredPoint p1, ColoredPoint p2, ColoredPoint p3)
 {
     if (!isCollinear(p1, p2, p3)) return false;
     if (p1.point.X != p2.point.X)
         return ((p1.point.X <= p3.point.X) && (p3.point.X <= p2.point.X) ||
             ((p1.point.X >= p3.point.X) && (p3.point.X >= p2.point.X)));
     else return ((p1.point.Y <= p3.point.Y) && (p3.point.Y <= p2.point.Y) ||
             ((p1.point.Y >= p3.point.Y) && (p3.point.Y >= p2.point.Y)));
 }
 bool intersectProp(ColoredPoint p1, ColoredPoint p2, ColoredPoint p3, ColoredPoint p4)
 {
     if (isCollinear(p1, p2, p3) || isCollinear(p1, p2, p4) || isCollinear(p3, p4, p1) || isCollinear(p3, p4, p2))
         return false;
     return Xor(Left(p1, p2, p3), Left(p1, p2, p4)) && Xor(Left(p3, p4, p1), Left(p3, p4, p2));
 }
 double Area2(ColoredPoint p1, ColoredPoint p2, ColoredPoint p3)
 {
     return (p2.point.X - p1.point.X) * (p3.point.Y - p1.point.Y) -
         (p3.point.X - p1.point.X) * (p2.point.Y - p1.point.Y);
 }
예제 #22
0
    public void BuildTriangle(ColoredPoint v0, ColoredPoint v1, ColoredPoint v2)
    {
        Vector3 normal = Vector3.Cross(v1 - v0, v2 - v0).normalized;

        BuildTriangle(v0, v1, v2, normal);
    }
예제 #23
0
 public Edge(ColoredPoint p1, ColoredPoint p2, ColoredPoint cut)
 {
     start = p1;
     end = p2;
     cutoff = cut;
 }
예제 #24
0
        public static UIElement GetColoredDataLabel(ColoredPoint cPoint)
        {
            StackPanel root = new StackPanel();
            root.Orientation = Orientation.Horizontal;
            root.Margin = new Thickness(2, 0, 2, 0);

            Ellipse legend = new Ellipse();
            legend.Width = legend.Height = 12;
            legend.Fill = new SolidColorBrush(cPoint.pointColor);

            TextBlock block = new TextBlock();
            block.Text = cPoint.name + ": " + cPoint.pointData.Y.ToString("#0.00");
            block.Margin = new Thickness(2, 0, 0, 0);

            root.Children.Add(legend);
            root.Children.Add(block);

            return root;
        }
예제 #25
0
 private bool CanContain(ColoredPoint point)
 {
     return(_bbox.Value.Contains(point.Position) == ContainmentType.Contains);
 }
 public void add(ColoredPoint p)
 {
     vertexColors[(int)p.vertexColor]++;
 }
        public bool noIntersection(double x1, double y1, double x2, double y2, Polygon p1)
        {
            ColoredPoint p2, p3;
            p2 = new ColoredPoint(x1, y1);
            p3 = new ColoredPoint(x2, y2);
            if (p1.vertices.Count <= 1) return true;
            if (p1.clockwise)
                for (int i = 1; i < p1.vertices.Count - 2; i++)
                {
                    if (intersect(p2, p3, p1.vertices[i], p1.vertices[i + 1]))
                    {
                        return false;
                    }
                }
            else
                for (int i = p1.vertices.Count - 1; i > 1; i--)
                {
                    if (intersect(p2, p3, p1.vertices[i - 1], p1.vertices[i]))
                    {
                        return false;
                    }

                }
            return true;
        }
예제 #28
0
 public void addDiagonal(ColoredPoint i, ColoredPoint j, ColoredPoint cutOff)
 {
     diagonalSet.Add(new Edge(i, j, cutOff));
 }
예제 #29
0
 public Edge(ColoredPoint p1, ColoredPoint p2)
 {
     start = p1;
     end = p2;
 }
예제 #30
0
 private bool CanContainOrIntersect(ColoredPoint octreePoint)
 {
     return(CanContain(octreePoint));
 }