SVGGraphics.GetCrossPoint C# (CSharp) Method

GetCrossPoint() public method

public GetCrossPoint ( Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4 ) : Vector2
p1 Vector2
p2 Vector2
p3 Vector2
p4 Vector2
return Vector2
    public Vector2 GetCrossPoint(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4)
    {
        Vector2 _return = new Vector2(0f, 0f);
        float a1 = 0f, b1 = 0f, a2 = 0f, b2 = 0f;

        float dx1, dy1, dx2, dy2;
        dx1 = p1.x - p2.x;
        dy1 = p1.y - p2.y;
        dx2 = p3.x - p4.x;
        dy2 = p3.y - p4.y;

        if(dx1 != 0f) {
          a1 = dy1 / dx1;
          b1 = p1.y - a1 * p1.x;
        }

        if(dx2 != 0) {
          a2 = dy2 / dx2;
          b2 = p3.y - a2 * p3.x;
        }

        float tx = 0f, ty = 0f;

        //truong hop nam tren duong thang
        if((a1 == a2) && (b1 == b2)) {
          Vector2 t_p1 = p1;
          Vector2 t_p2 = p1;
          if(dx1 == 0f) {
        if(p2.y < t_p1.y)
          t_p1 = p2;
        if(p3.y < t_p1.y)
          t_p1 = p3;
        if(p4.y < t_p1.y)
          t_p1 = p4;

        if(p2.y > t_p2.y)
          t_p2 = p2;
        if(p3.y > t_p2.y)
          t_p2 = p3;
        if(p4.y > t_p2.y)
          t_p2 = p4;
          } else {
        if(p2.x < t_p1.x)
          t_p1 = p2;
        if(p3.x < t_p1.x)
          t_p1 = p3;
        if(p4.x < t_p1.x)
          t_p1 = p4;

        if(p2.x > t_p2.x)
          t_p2 = p2;
        if(p3.x > t_p2.x)
          t_p2 = p3;
        if(p4.x > t_p2.x)
          t_p2 = p4;
          }

          tx = (t_p1.x - t_p2.x) / 2f;
          tx = t_p2.x + tx;

          ty = (t_p1.y - t_p2.y) / 2f;
          ty = t_p2.y + ty;

          _return.x = tx;
          _return.y = ty;
          return _return;
        }

        if((dx1 != 0) && (dx2 != 0)) {
          tx = -(b1 - b2) / (a1 - a2);
          ty = a1 * tx + b1;
        } else if((dx1 == 0) && (dx2 != 0)) {
          tx = p1.x;
          ty = a2 * tx + b2;
        } else if((dx1 != 0) && (dx2 == 0)) {
          tx = p3.x;
          ty = a1 * tx + b1;
        }

        _return.x = tx;
        _return.y = ty;
        return _return;
    }

Usage Example

Example #1
0
    private void StrokeLineJoin(Vector2 p1, Vector2 p2, Vector2 p3, float width)
    {
        if ((int)width == 1)
        {
            return;
        }
        if (((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)) <= 4f)
        {
            return;
        }
        if (_graphics.StrokeLineJoin == SVGStrokeLineJoinMethod.Round)
        {
            _graphics.FillCircle(p2, width / 2f);
            return;
        }

        if ((_graphics.StrokeLineJoin == SVGStrokeLineJoinMethod.Miter) ||
            (_graphics.StrokeLineJoin == SVGStrokeLineJoinMethod.Unknown))
        {
            Vector2 _p1 = Vector2.zero;
            Vector2 _p2 = Vector2.zero;
            Vector2 _p3 = Vector2.zero;
            Vector2 _p4 = Vector2.zero;

            _graphics.GetThickLine(p1, p2, width, ref _p1, ref _p2, ref _p3, ref _p4);


            Vector2 _p5 = Vector2.zero;
            Vector2 _p6 = Vector2.zero;
            Vector2 _p7 = Vector2.zero;
            Vector2 _p8 = Vector2.zero;

            _graphics.GetThickLine(p2, p3, width, ref _p5, ref _p6, ref _p7, ref _p8);

            Vector2 _cp1, _cp2;
            _cp1 = _graphics.GetCrossPoint(_p1, _p3, _p5, _p7);
            _cp2 = _graphics.GetCrossPoint(_p2, _p4, _p6, _p8);


            //Vector2[] points = new Vector2[8];
            joint_points[0] = p2;
            joint_points[1] = _p3;
            joint_points[2] = _cp1;
            joint_points[3] = _p5;

            joint_points[4] = p2;
            joint_points[5] = _p6;
            joint_points[6] = _cp2;
            joint_points[7] = _p4;
            _graphics.FillPolygon(joint_points);
            return;
        }
        if (_graphics.StrokeLineJoin == SVGStrokeLineJoinMethod.Bevel)
        {
            Vector2 _p1 = Vector2.zero;
            Vector2 _p2 = Vector2.zero;
            Vector2 _p3 = Vector2.zero;
            Vector2 _p4 = Vector2.zero;

            _graphics.GetThickLine(p1, p2, width, ref _p1, ref _p2, ref _p3, ref _p4);


            Vector2 _p5 = Vector2.zero;
            Vector2 _p6 = Vector2.zero;
            Vector2 _p7 = Vector2.zero;
            Vector2 _p8 = Vector2.zero;

            _graphics.GetThickLine(p2, p3, width, ref _p5, ref _p6, ref _p7, ref _p8);

            joint_points_small[0] = p2;
            joint_points_small[1] = _p3;
            joint_points_small[2] = _p5;

            joint_points_small[3] = p2;
            joint_points_small[4] = _p6;
            joint_points_small[5] = _p4;
            _graphics.FillPolygon(joint_points_small);
            return;
        }
    }