# Thread: Fourth vertex of a Rectangle

1. ## Fourth vertex of a Rectangle

Hi

If 3 Vertices' xy coordinates are given from a rectangle, how to calculate the fourth one's xy?
The rectangle could be in any position.

Thanks.

2. ## Re: Fourth vertex of a Rectangle

First you need to orient the three vertices. After that it's very simple.

Consider the three vertices as three points in a triangle, A, B, and C. We need to figure out which vertex corresponds to the right angle. You can compute the angle from a point P to points Q and R as

angle(P, Q, R) = Acos[(Q-P) dot (R-P) / [|Q-P| * |R-P|]]

where Acos is the inverse cosine, (Q-P) etc. is vector subtraction (subtract componentwise), |Q-P| etc. is the magnitude of a vector (sum the squares of the components and take the square root--this is the content of the Pythagorean theorem), and (Q-P) dot (R-P) is the dot product (multiply the x components together, then the y components, etc. and add the results).

Compute angle(A, B, C), angle(B, C, A), and angle(C, A, B). One of these should be very, very close to 90 degrees (pi/2 radians). If it's the first one, the vertex is at A; the second gives a vertex at B, and the third a vertex at C.

Now suppose the vertex is at P and the other two points are Q and R. The fourth point on the rectangle is at Q + (R-P).

3. ## Re: Fourth vertex of a Rectangle

Thanks, really good idea to calculate 90 angle. But write in VB takes time.

4. ## Re: Fourth vertex of a Rectangle

If you need help with coding my idea, you can ask in the appropriate forum (the .NET or VB6 ones depending on your language). If you need a formula expanded or explained you can ask here in the maths forum.

5. ## Re: Fourth vertex of a Rectangle

Ye, I will try to code first.
Thanks

6. ## Re: Fourth vertex of a Rectangle

Code:
```Partial Public Class Window2

Public Sub New()

' This call is required by the Windows Form Designer.
InitializeComponent()

' Add any initialization after the InitializeComponent() call.

End Sub
Private Sub msg()
Dim Point1 As Point = New Point(-1, -1)
Dim Point2 As Point = New Point(-4, -1)
Dim Point3 As Point = New Point(-1, -5)
Dim PointWithBiggestAngle As Integer = GetPointOnBiggestAngle(Point1, Point2, Point3)
Dim P, Q, R As Point
Select Case PointWithBiggestAngle
Case 1
P = Point1
Q = Point2
R = Point3
Case 2
P = Point2
Q = Point1
R = Point3
Case 3
P = Point3
Q = Point2
R = Point1
End Select
Dim Point4X As Long = Q.X + (R.X - P.X)
Dim Point4Y As Long = Q.Y + (R.Y - P.Y)
Debug.WriteLine(Point4X & " " & Point4Y)
End Sub

Private Sub Window2_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
msg()
End Sub
Private Function GetPointOnBiggestAngle(ByVal P As Point, ByVal Q As Point, ByVal R As Point) As Integer
Dim AngleOfP As Double = GetAngle(P, Q, R)
Dim AngleOfQ As Double = GetAngle(Q, P, R)
Dim AngleOfR As Double = GetAngle(R, Q, P)
If AngleOfP > AngleOfQ AndAlso AngleOfP > AngleOfR Then
Return 1
ElseIf AngleOfQ > AngleOfP AndAlso AngleOfQ > AngleOfR Then
Return 2
ElseIf AngleOfR > AngleOfP AndAlso AngleOfR > AngleOfQ Then
Return 3
Else
Return 0
End If
End Function
Private Function GetAngle(ByVal anglePoint As Point, ByVal Q As Point, ByVal R As Point) As Double
Dim a As Double = Math.Sqrt((Q.X - R.X) ^ 2 + (Q.Y - R.Y) ^ 2)	'anglePoint's opposite side length
Dim b As Double = Math.Sqrt((anglePoint.X - R.X) ^ 2 + (anglePoint.Y - R.Y) ^ 2)	' Q's opposite side length
Dim c As Double = Math.Sqrt((Q.X - anglePoint.X) ^ 2 + (Q.Y - anglePoint.Y) ^ 2)
Return Math.Acos((b ^ 2 + c ^ 2 - a ^ 2) / (2 * b * c))
End Function
End Class```

#### Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts
•

Featured