Turning three points into a triangle, need help rotating the wedges

I have made a module script that can create a triangle when given three positions by using two right triangles (wedge parts). However, I have only managed to get the correct size and positions so far, and do not know how to rotate the triangles to match the points. Here is the desired result, achieved by manually rotating the triangles myself:

And here is what is currently outputted:

This is the module script I have made, named ‘Triangle’. As a side note, I know that the script does not check if the points form a right triangle already. I can fix that later.

-- In the command bar
local triangulate = require(game.ServerScriptService.Triangle)
triangulate( workspace.A.Position, workspace.B.Position, workspace.C.Position )
-- In a module script
local function cosineRule( a:number, b:number, c:number )
	--// Given lengths a, b, and c, return the Theta of angle BAC/CAB
	--// https://www.onlinemathlearning.com/image-files/law-of-cosines.png
	--// NOTE: b & c can be swapped without altering the algorithm
	--// cosA	= ( -a^2 + b^2 + c^2 ) / 2bc  
	--// A		= arccos[ (-a^2 + b^2 + c^2 ) / 2bc ]
	return math.acos( (-a^2 + b^2 + c^2) / (2*b*c) )

local function triangulateThreePoints( A:Vector3, B:Vector3, C:Vector3 )
	local vecAB = B - A
	local vecAC = C - A
	local vecBC = C - B
	local lineAB = (B - A).Magnitude
	local lineAC = (C - A).Magnitude
	local lineBC = (C - B).Magnitude
	--// Organize the lines from longest to shortest
	local longestLine	= math.max( lineAB, lineAC, lineBC )
	--// Always make it so LineBC is the longest line. This will remove the
	--// reduntant code that would have been made to account for each side.
	if longestLine ~= lineBC then
		local temp = lineBC
		lineBC = longestLine
		if longestLine == lineAB then
			lineAB = temp					--// Point A <--> Point C
			print 'a <--> c'
		elseif longestLine == lineAC then
			lineAC = temp					--// Point A <--> Point B
			print 'a <--> b'
		longestLine	= math.max( lineAB, lineAC, lineBC )
	--// LineH divides the triangle into two right triangles.
	--// It is perpendicular to the longest line and goes towards
	--// the point that does not form the longest time.
	--// (Perpendicular to LineBC means it will go towards Point A.)
	--// Due to my swapping earlier, LineH (now denoted as LineAH) will
	--// always perpedicularly intersect LineBC and goes toward point A.
	--// Get angle ABC to calc length of LineAH
	--// sinT = opp / hyp
	--// T[heta] is found via consineRule
	--// opp = sinT * hyp
	local T = cosineRule( lineAC, lineAB, lineBC )
	local lineAH = math.sin( T ) * lineAB
	--// Create the first right triangle
	--// I got LineAB, LineAH, I still need LineBH
	local lineBH = math.cos( T ) * lineAB
	local triangleABH = Instance.new("WedgePart")
		triangleABH.Size = Vector3.new( 0.1, lineAH, lineBH )
		triangleABH.Position = A:Lerp( B, 0.5 )
		--// triangleABH.CFrame = triangleABH.CFrame * CFrame.Angles( ??? )
		triangleABH.BrickColor = BrickColor.new("Deep orange")
		triangleABH.Parent = workspace
	--// Second right triangle
	T = cosineRule( lineAB, lineAC, lineBC )
	local lineCH = math.cos( T ) * lineAC
	local triangleACH = Instance.new("WedgePart")
		triangleACH.Size = Vector3.new( 0.1, lineAH, lineCH )
		triangleACH.Position = A:Lerp( C, 0.5 )
		--// triangleACH.CFrame = triangleACH.CFrame * CFrame.Angles( ??? )
		triangleACH.BrickColor = BrickColor.new("Cyan")
		triangleACH.Parent = workspace
		["lineAB"] = lineAB
		,["lineAC"] = lineAC
		,["lineBC"] = lineBC
		,["AngABC"] = math.deg(cosineRule( lineAC, lineBC, lineAB ))
		,["AngACB"] = math.deg(cosineRule( lineAB, lineBC, lineAC ))
		,["AngBAC"] = math.deg(cosineRule( lineBC, lineAC, lineAB ))
		,["LongestLine"] = longestLine
		,["LineAH"] = lineAH

return triangulateThreePoints

You could use CFrame.lookAt. I think it would work but if not you could try getting some inspiration from EgoMooses article.

1 Like

Well gosh dang it I just reinvented the wheel huh.

I see so many parallels in my code in that article, even the optimization section. Thank you very much.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.