Jump to content

Angle / Direction


Jayceon

Recommended Posts

Hello.

I started to create a real GPS with sound effects (like -> turn left, turn right, go x meters and turn left/right), but when i'm try to get the road angles the left/right turns fails.

 

function createGPSRoute(x, y)
	local occupiedVehicle = getPedOccupiedVehicle(localPlayer)
	
	if occupiedVehicle then
		local vehicleX, vehicleY, vehicleZ = getElementPosition(occupiedVehicle)
		local _, _, vehicleRotation = getElementRotation(occupiedVehicle)
		
		gpsRoute = calculatePathByCoords(vehicleX, vehicleY, vehicleZ, x, y, 0)
		gpsWaypoints = {}
		
		if #gpsRoute ~= 0 then
			local possibleRoutes = {}
			
			for k, v in pairs(gpsRoute) do
				--[[
				--
				-- First attempt
				--
				
				local nextNodeID = k + 1
				local nextNode = gpsRoute[nextNodeID]
				
				if nextNode then
					table.insert(possibleRoutes, {k, nextNodeID})
				end
				]]
				
				local previousNodeID = k - 1
				local previousNode = gpsRoute[previousNodeID]
				
				if previousNode then
					table.insert(possibleRoutes, {k, previousNodeID})
				end
			end

			local turns = {} -- only the gps gui, turn left/right, go x meters..
			local previousRoadAngle = 0
			local previousRoadDirection = ""
			
			local forwardRoadCount = 0
			local forwardRoadDistance = 750
			
			for k, v in pairs(possibleRoutes) do
				local roadAngle = getAngle(gpsRoute[v[2]].x, gpsRoute[v[2]].y, gpsRoute[v[1]].x, gpsRoute[v[1]].y)
				local roadDirection = "N/A"
				local roadDistance = getDistanceBetweenPoints3D(vehicleX, vehicleY, vehicleZ, gpsRoute[v[1]].x, gpsRoute[v[1]].y, gpsRoute[v[1]].z)
				
				if roadAngle <= 360 and roadAngle >= 180 then
					roadDirection = "right"
				elseif roadAngle >= 0 and roadAngle <= 180 then
					roadDirection = "left"
				end
				
				if k == 1 then
					previousRoadAngle = roadAngle
					previousRoadDirection = roadDirection
				end
				
				local nextNode = possibleRoutes[k + 1]
				
				table.insert(gpsWaypoints, {k, roadDirection, roadDistance, roadAngle}) -- this table for render to visible nodes and for the minimap lines
				
				if nextNode then
					local isTurnRoad = false
					
					if previousRoadAngle ~= roadAngle or roadDirection ~= previousRoadDirection then
						local angleDifference = getAnglesDifference(previousRoadAngle, roadAngle)
						
						if angleDifference ~= 0 then
							if angleDifference <= -12 or angleDifference >= 12 then
								table.insert(turns, {k, roadDirection, roadDistance})
								isTurnRoad = true
							end
						end
					end
					
					if not isTurnRoad then
						if roadDistance >= forwardRoadDistance then -- add every 750 meters
							isForwardRoad = true
							forwardRoadDistance = forwardRoadDistance + 750
							table.insert(turns, {k, "forward", roadDistance})
						end
					end
					
					previousRoadAngle = roadAngle
					previousRoadDirection = roadDirection
				end
				
				if k == #possibleRoutes then
					table.insert(turns, {"end", "end", roadDistance}) -- the last node, when reach it the gps destination switch off
				end
			end
			
			outputConsole(inspect(turns)) -- print the possible turns/directions. format: {table id, direction (left/right/forward), distance between)
		end
	end
end

function getAnglesDifference(angle1, angle2)
	angle1 = angle1 % 360
	angle2 = angle2 % 360
	
	local difference = (angle1 - angle2) % 360
	
	if difference <= 180 then
		return difference
	else
		return -(360 - difference)
	end
end

function getAngle(x1, y1, x2, y2)
	local angle = -math.deg(math.atan2(x2 - x1, y2 - y1))
	
	if angle < 0 then
		angle = angle + 360
	end
	
	return angle
end 

--[[
-- I tried the next function, but the same problem

function getAngle(x1, y1, x2, y2)
	return (360 - math.deg(math.atan2((x2 - x1), (y2 - y1)))) % 360
end]]

 

Thanks the replies.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...