TizzyT

Intersection -TizzyT

Feb 13th, 2017
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 16.34 KB | None | 0 0
  1. Module Module1
  2.     Public Class Misc
  3.         'Chained comparison function
  4.         Public Shared Function CCOMP(Of T)(ParamArray ByVal item() As T) As Boolean
  5.             Dim Prev As T = Nothing
  6.             For Each I As T In item
  7.                 If Prev IsNot Nothing Then If Not I.Equals(Prev) Then Return False
  8.                 Prev = I
  9.             Next
  10.             Return True
  11.         End Function
  12.     End Class
  13.  
  14.     Public Structure XDecimal
  15.         Public Shared Zero As New XDecimal(0D)
  16.         Public Shared NegativeOne As New XDecimal(-1D)
  17.  
  18.         Private ReadOnly State As States
  19.         Private ReadOnly Value As Decimal
  20.  
  21.         Public Enum States
  22.             NaN
  23.             Number
  24.             Undefined
  25.         End Enum
  26.  
  27.         Public Sub New(Value As Decimal)
  28.             State = States.Number
  29.             Me.Value = Value
  30.         End Sub
  31.  
  32.         Public Sub New(State As States)
  33.             Me.State = State
  34.         End Sub
  35.  
  36.         Public Overrides Function ToString() As String
  37.             If State = States.Number Then Return Value.ToString
  38.             Return State.ToString
  39.         End Function
  40.  
  41.         Public Shared Narrowing Operator CType(ByVal Dec As Decimal) As XDecimal
  42.             Return New XDecimal(Dec)
  43.         End Operator
  44.  
  45.         Public Shared Operator =(XDec1 As XDecimal, XDec2 As XDecimal) As Boolean
  46.             If XDec1.State = XDec2.State Then
  47.                 If XDec1.State = States.Number Then Return XDec1.Value = XDec2.Value Else Return False
  48.             End If
  49.             Return False
  50.         End Operator
  51.         Public Shared Operator =(XDec As XDecimal, State As States) As Boolean
  52.             Return XDec.State = State
  53.         End Operator
  54.  
  55.         Public Shared Operator <>(XDec1 As XDecimal, XDec2 As XDecimal) As Boolean
  56.             If XDec1.State = XDec2.State Then
  57.                 If XDec1.State = States.Number Then Return XDec1.Value = XDec2.Value Else Return True
  58.             End If
  59.             Return True
  60.         End Operator
  61.         Public Shared Operator <>(XDec As XDecimal, State As States) As Boolean
  62.             Return XDec.State <> State
  63.         End Operator
  64.  
  65.         Public Shared Operator *(XDec1 As XDecimal, XDec2 As XDecimal) As XDecimal
  66.             If XDec1.State = States.Number AndAlso XDec2.State = States.Number Then Return New XDecimal(XDec1.Value * XDec2.Value)
  67.             If XDec1.State = States.NaN OrElse XDec2.State = States.NaN Then Return New XDecimal(States.NaN)
  68.             Return New XDecimal(States.Undefined)
  69.         End Operator
  70.  
  71.         Public Shared Operator /(XDec1 As XDecimal, XDec2 As XDecimal) As XDecimal
  72.             If XDec1.State = States.Number AndAlso XDec2.State = States.Number Then
  73.                 If XDec2.Value = 0D Then Return New XDecimal(States.Undefined)
  74.                 Return New XDecimal(XDec1.Value / XDec2.Value)
  75.             End If
  76.             If XDec1.State = States.NaN OrElse XDec2.State = States.NaN Then Return New XDecimal(States.NaN)
  77.             Return New XDecimal(States.Undefined)
  78.         End Operator
  79.  
  80.         Public Shared Operator +(XDec1 As XDecimal, XDec2 As XDecimal) As XDecimal
  81.             If XDec1.State = States.Number AndAlso XDec2.State = States.Number Then Return New XDecimal(XDec1.Value + XDec2.Value)
  82.             If XDec1.State = States.NaN OrElse XDec2.State = States.NaN Then Return New XDecimal(States.NaN)
  83.             Return New XDecimal(States.Undefined)
  84.         End Operator
  85.  
  86.         Public Shared Operator -(XDec1 As XDecimal, XDec2 As XDecimal) As XDecimal
  87.             If XDec1.State = States.Number AndAlso XDec2.State = States.Number Then Return New XDecimal(XDec1.Value - XDec2.Value)
  88.             If XDec1.State = States.NaN OrElse XDec2.State = States.NaN Then Return New XDecimal(States.NaN)
  89.             Return New XDecimal(States.Undefined)
  90.         End Operator
  91.  
  92.         Public Shared Operator <(XDec1 As XDecimal, XDec2 As XDecimal) As Boolean
  93.             If XDec1.State = States.Number AndAlso XDec2.State = States.Number Then Return XDec1.Value < XDec2.Value
  94.             Return False
  95.         End Operator
  96.  
  97.         Public Shared Operator >(XDec1 As XDecimal, XDec2 As XDecimal) As Boolean
  98.             If XDec1.State = States.Number AndAlso XDec2.State = States.Number Then Return XDec1.Value > XDec2.Value
  99.             Return False
  100.         End Operator
  101.  
  102.         Public Shared Operator >=(XDec1 As XDecimal, XDec2 As XDecimal) As Boolean
  103.             If XDec1.State = States.Number AndAlso XDec2.State = States.Number Then Return XDec1.Value >= XDec2.Value
  104.             Return False
  105.         End Operator
  106.  
  107.         Public Shared Operator <=(XDec1 As XDecimal, XDec2 As XDecimal) As Boolean
  108.             If XDec1.State = States.Number AndAlso XDec2.State = States.Number Then Return XDec1.Value <= XDec2.Value
  109.             Return False
  110.         End Operator
  111.     End Structure
  112.  
  113.     Public Structure Point
  114.         Public ReadOnly X As XDecimal
  115.         Public ReadOnly Y As XDecimal
  116.         Public Sub New(ByVal X As XDecimal, ByVal Y As XDecimal)
  117.             Me.X = X
  118.             Me.Y = Y
  119.         End Sub
  120.     End Structure
  121.  
  122.     Public Structure Line
  123.         Public ReadOnly P1 As Point
  124.         Public ReadOnly P2 As Point
  125.         Public ReadOnly Slope As XDecimal
  126.         Public ReadOnly Yintercept As XDecimal
  127.         Public ReadOnly Xintercept As XDecimal
  128.         Public ReadOnly IsVerticalLine As Boolean
  129.         Public ReadOnly IsHorizontalLine As Boolean
  130.         Public Sub New(ByVal X1 As XDecimal, ByVal Y1 As XDecimal, ByVal X2 As XDecimal, ByVal Y2 As XDecimal)
  131.             P1 = New Point(X1, Y1)
  132.             P2 = New Point(X2, Y2)
  133.             Slope = (P2.Y - P1.Y) / (P2.X - P1.X)
  134.             If Slope = XDecimal.Zero Then
  135.                 IsVerticalLine = False
  136.                 IsHorizontalLine = True
  137.                 Xintercept = XDecimal.States.Undefined
  138.                 Yintercept = P1.Y
  139.             ElseIf Slope = XDecimal.States.Undefined Then
  140.                 IsVerticalLine = True
  141.                 IsHorizontalLine = False
  142.                 Yintercept = XDecimal.States.Undefined
  143.                 Xintercept = P1.X
  144.             Else
  145.                 Yintercept = P1.Y - (P1.X * Slope)
  146.                 Xintercept = (Yintercept * XDecimal.NegativeOne) / Slope
  147.             End If
  148.         End Sub
  149.         Public Sub New(ByVal P1 As Point, ByVal P2 As Point)
  150.             Me.P1 = P1
  151.             Me.P2 = P2
  152.             Slope = (P2.Y - P1.Y) / (P2.X - P1.X)
  153.             If Slope = XDecimal.Zero Then
  154.                 IsVerticalLine = False
  155.                 IsHorizontalLine = True
  156.                 Xintercept = XDecimal.States.Undefined
  157.                 Yintercept = P1.Y
  158.             ElseIf Slope = XDecimal.States.Undefined Then
  159.                 IsVerticalLine = True
  160.                 IsHorizontalLine = False
  161.                 Yintercept = XDecimal.States.Undefined
  162.                 Xintercept = P1.X
  163.             Else
  164.                 Yintercept = P1.Y - (P1.X * Slope)
  165.                 Xintercept = (Yintercept * XDecimal.NegativeOne) / Slope
  166.             End If
  167.         End Sub
  168.  
  169.         'Line Intersects Point
  170.         Public Function Intersects(ByVal Point As Point) As Boolean
  171.             If Slope = XDecimal.States.Undefined Then Return Point.X = P1.X
  172.             If Slope = XDecimal.Zero Then Return Point.Y = P1.Y
  173.             If (Point.X * Slope) + Yintercept = Point.Y Then Return True
  174.             Return False
  175.         End Function
  176.         'Line Intersects Line
  177.         Public Function Intersects(ByVal Line As Line) As Boolean
  178.             If Slope = Line.Slope Then Return P1.Y = Line.P1.Y
  179.             If Slope = XDecimal.States.Undefined AndAlso Line.Slope = XDecimal.States.Undefined Then Return P1.X = Line.P1.X
  180.             Return True
  181.         End Function
  182.  
  183.         Public Shared Function GetSlope(ByVal X1 As XDecimal, ByVal Y1 As XDecimal, ByVal X2 As XDecimal, ByVal Y2 As XDecimal) As XDecimal
  184.             Return (Y2 - Y1) / (X2 - X1)
  185.         End Function
  186.         Public Shared Function GetYintercept(ByVal X1 As XDecimal, ByVal Y1 As XDecimal, ByVal X2 As XDecimal, ByVal Y2 As XDecimal) As XDecimal
  187.             Dim Slope As XDecimal = GetSlope(X1, Y1, X2, Y2)
  188.             Return Y1 - (X1 * Slope)
  189.         End Function
  190.         Public Shared Function GetXintercept(ByVal X1 As XDecimal, ByVal Y1 As XDecimal, ByVal X2 As XDecimal, ByVal Y2 As XDecimal) As XDecimal
  191.             Dim Slope As XDecimal = GetSlope(X1, Y1, X2, Y2)
  192.             Dim Yintercept As XDecimal = Y1 - (X1 * Slope)
  193.             Return (Yintercept * -1) / Slope
  194.         End Function
  195.     End Structure
  196.  
  197.     Public Structure LineSegment
  198.         Public ReadOnly P1 As Point
  199.         Public ReadOnly P2 As Point
  200.         Public ReadOnly Slope As XDecimal
  201.         Public ReadOnly Yintercept As XDecimal
  202.         Public ReadOnly Xintercept As XDecimal
  203.         Public ReadOnly IsVerticalLineSegment As Boolean
  204.         Public ReadOnly IsHorizontalLineSegment As Boolean
  205.         Public Sub New(ByVal X1 As XDecimal, ByVal Y1 As XDecimal, ByVal X2 As XDecimal, ByVal Y2 As XDecimal)
  206.             P1 = New Point(X1, Y1)
  207.             P2 = New Point(X2, Y2)
  208.             Slope = (P2.Y - P1.Y) / (P2.X - P1.X)
  209.             If Slope = XDecimal.Zero Then
  210.                 IsVerticalLineSegment = False
  211.                 IsHorizontalLineSegment = True
  212.                 Xintercept = XDecimal.States.Undefined
  213.                 If (P1.X <= XDecimal.Zero AndAlso P2.X >= XDecimal.Zero) _
  214.                     OrElse (P2.X <= XDecimal.Zero AndAlso P1.X >= XDecimal.Zero) _
  215.                     Then Yintercept = P1.Y Else Yintercept = XDecimal.States.Undefined
  216.             ElseIf Slope = XDecimal.States.Undefined Then
  217.                 IsVerticalLineSegment = True
  218.                 IsHorizontalLineSegment = False
  219.                 Yintercept = XDecimal.States.Undefined
  220.                 If (P1.Y >= XDecimal.Zero AndAlso P2.Y <= XDecimal.Zero) _
  221.                     OrElse (P2.Y <= XDecimal.Zero AndAlso P1.Y >= XDecimal.Zero) _
  222.                     Then Xintercept = P1.X _
  223.                     Else Xintercept = XDecimal.States.Undefined
  224.             Else
  225.                 If (P1.X <= XDecimal.Zero AndAlso P2.X >= XDecimal.Zero) _
  226.                     OrElse (P2.X <= XDecimal.Zero AndAlso P1.X >= XDecimal.Zero) _
  227.                     Then Yintercept = P1.Y - (P1.X * Slope) _
  228.                     Else Yintercept = XDecimal.States.Undefined
  229.                 If (P1.Y >= XDecimal.Zero AndAlso P2.Y <= XDecimal.Zero) _
  230.                     OrElse (P2.Y <= XDecimal.Zero AndAlso P1.Y >= XDecimal.Zero) _
  231.                     Then Xintercept = (Yintercept * XDecimal.NegativeOne) / Slope _
  232.                     Else Xintercept = XDecimal.States.Undefined
  233.             End If
  234.         End Sub
  235.         Public Sub New(ByVal P1 As Point, ByVal P2 As Point)
  236.             Me.P1 = P1
  237.             Me.P2 = P2
  238.             Slope = (P2.Y - P1.Y) / (P2.X - P1.X)
  239.             If Slope = XDecimal.Zero Then
  240.                 IsVerticalLineSegment = False
  241.                 IsHorizontalLineSegment = True
  242.                 Xintercept = XDecimal.States.Undefined
  243.                 If (P1.X <= XDecimal.Zero AndAlso P2.X >= XDecimal.Zero) _
  244.                     OrElse (P2.X <= XDecimal.Zero AndAlso P1.X >= XDecimal.Zero) _
  245.                     Then Yintercept = P1.Y Else Yintercept = XDecimal.States.Undefined
  246.             ElseIf Slope = XDecimal.States.Undefined Then
  247.                 IsVerticalLineSegment = True
  248.                 IsHorizontalLineSegment = False
  249.                 Yintercept = XDecimal.States.Undefined
  250.                 If (P1.Y >= XDecimal.Zero AndAlso P2.Y <= XDecimal.Zero) _
  251.                     OrElse (P2.Y <= XDecimal.Zero AndAlso P1.Y >= XDecimal.Zero) _
  252.                     Then Xintercept = P1.X _
  253.                     Else Xintercept = XDecimal.States.Undefined
  254.             Else
  255.                 If (P1.X <= XDecimal.Zero AndAlso P2.X >= XDecimal.Zero) _
  256.                     OrElse (P2.X <= XDecimal.Zero AndAlso P1.X >= XDecimal.Zero) _
  257.                     Then Yintercept = P1.Y - (P1.X * Slope) _
  258.                     Else Yintercept = XDecimal.States.Undefined
  259.                 If (P1.Y >= XDecimal.Zero AndAlso P2.Y <= XDecimal.Zero) _
  260.                     OrElse (P2.Y <= XDecimal.Zero AndAlso P1.Y >= XDecimal.Zero) _
  261.                     Then Xintercept = (Yintercept * XDecimal.NegativeOne) / Slope _
  262.                     Else Xintercept = XDecimal.States.Undefined
  263.             End If
  264.         End Sub
  265.         'LineSegment Intersects Point
  266.         Public Function Intersects(ByVal Point As Point) As Boolean
  267.             If (Point.X >= P1.X AndAlso Point.X <= P2.X) _
  268.                 OrElse (Point.X >= P2.X AndAlso Point.X <= P1.X) _
  269.                 Then Return (Point.X * Slope) + Yintercept = Point.Y
  270.             Return False
  271.         End Function
  272.         'LineSegment Intersects Line
  273.         Public Function Intersects(ByVal Line As Line) As Boolean
  274.             If Slope = XDecimal.States.Undefined Then
  275.                 If Line.Slope = XDecimal.States.Undefined Then Return P1.X = Line.P1.X
  276.                 Return Intersects(New Point(P1.X, (P1.X * Line.Slope) + Line.Yintercept))
  277.             ElseIf Slope = Line.Slope Then
  278.                 Return Line.Intersects(New Point(P1.X, P1.Y))
  279.             Else
  280.                 Dim X1 As XDecimal = (Line.Slope * P1.X) + Line.Yintercept
  281.                 Dim X2 As XDecimal = (Line.Slope * P2.X) + Line.Yintercept
  282.                 If X1 <= P1.X Then Return X2 >= P2.X Else If X1 >= P1.X Then Return X2 <= P2.X
  283.             End If
  284.             Return False
  285.         End Function
  286.         'LineSegment Intersects LineSegment
  287.         Public Function Intersects(ByVal LineSegment As LineSegment) As Boolean
  288.             If Slope = XDecimal.States.Undefined Then
  289.                 If LineSegment.Slope = XDecimal.States.Undefined Then
  290.                     If P1.X = LineSegment.P1.X Then
  291.                         If (P1.Y >= LineSegment.P1.Y AndAlso P2.Y <= LineSegment.P1.Y) _
  292.                             OrElse (P1.Y <= LineSegment.P1.Y AndAlso P2.Y >= LineSegment.P1.Y) _
  293.                             Then Return True
  294.                     End If
  295.                     Return False
  296.                 Else
  297.                     Dim L As New Line(LineSegment.P1, LineSegment.P2)
  298.                     Return LineSegment.Intersects(New Point(P1.X, (P1.X * L.Slope) + L.Yintercept))
  299.                 End If
  300.             Else
  301.                 If LineSegment.Slope = XDecimal.States.Undefined Then
  302.                     Dim L As New Line(P1, P2)
  303.                     Return Intersects(New Point(LineSegment.P1.X, (LineSegment.P1.X * L.Slope) + L.Yintercept))
  304.                 Else
  305.                     Dim L1 As New Line(P1, P2)
  306.                     Dim L2 As New Line(LineSegment.P1, LineSegment.P2)
  307.                     Dim X As XDecimal = (L2.Yintercept - L1.Yintercept) / (L1.Slope - L2.Slope)
  308.                     If (X >= L1.P1.X AndAlso X <= L1.P2.X) OrElse (X <= L1.P1.X AndAlso X >= L1.P2.X) Then Return True
  309.                 End If
  310.             End If
  311.             Return False
  312.         End Function
  313.  
  314.         Public Shared Function GetSlope(ByVal X1 As XDecimal, ByVal Y1 As XDecimal, ByVal X2 As XDecimal, ByVal Y2 As XDecimal) As XDecimal
  315.             Return (Y2 - Y1) / (X2 - X1)
  316.         End Function
  317.     End Structure
  318.  
  319.     Private Structure Circle
  320.         Public X As XDecimal
  321.         Public Y As XDecimal
  322.         Public Radius As XDecimal
  323.  
  324.         Public Sub New(ByVal X As XDecimal, ByVal Y As XDecimal, ByVal Radius As XDecimal)
  325.             Me.X = X
  326.             Me.Y = Y
  327.             Me.Radius = Radius
  328.         End Sub
  329.  
  330.         Public Function ContainsPoint(ByVal Point As Point) As Boolean
  331.             Dim _X As XDecimal = Point.X - X
  332.             _X *= _X
  333.             Dim _Y As XDecimal = Point.Y - Y
  334.             _Y *= _Y
  335.             If _X + _Y <= Radius * Radius Then Return True
  336.             Return False
  337.         End Function
  338.  
  339.         Public Function Intersects(ByVal Line As Line) As Boolean
  340.  
  341.         End Function
  342.  
  343.         Public Function Intersects(ByVal LineSegment As LineSegment) As Boolean
  344.  
  345.         End Function
  346.  
  347.         Public Function Intersects(ByVal Circle As Circle) As Boolean
  348.             Dim _X As XDecimal = Circle.X - X
  349.             _X *= _X
  350.             Dim _Y As XDecimal = Circle.Y - Y
  351.             _Y *= _Y
  352.             If _X + _Y <= (Radius * Radius) + (Circle.Radius * Circle.Radius) Then Return True
  353.             Return False
  354.         End Function
  355.     End Structure
  356. End Module
Advertisement
Add Comment
Please, Sign In to add comment