JacopoLevati-Creator 8205730eb5 commit
2025-03-17 12:22:09 +01:00

44 lines
1.9 KiB
C#

namespace UltimateProceduralPrimitivesFREE
{
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StereographicProjection
{
public void ExecuteStereographicProjection(List<Vector3> ref_verts, List<Vector3> ref_origin_verts, float radius, Vector3 transform)
{
var error_margin = new Vector3(0.001f, 0.001f, 0.001f); // mandated by the delaunay transform
var origin = new Vector3(0, 0, -radius);
var sp = Vector3.zero;
for (int i = 0; i < ref_verts.Count; i++)
{
var coord = ref_origin_verts[i];
if ((coord.x - origin.x <= error_margin.x) && (coord.y - origin.y <= error_margin.y) && (coord.z - origin.z <= error_margin.z))
{
var corrected_coords = new Vector3(1.0f, ((float)Random.Range(0, 1000) / 1000.0f) * 2.0f - 1.0f, -radius + error_margin.z); // introduce randomness in case there are more than one problematic points
sp = new Vector3(Project(radius, corrected_coords.x, corrected_coords.z), Project(radius, corrected_coords.y, corrected_coords.z), -1.0f);
}
else
{
sp = new Vector3(Project(radius, coord.x, coord.z), Project(radius, coord.y, coord.z), -1.0f);
}
var newVertX = sp.x * (1.0f - transform.x) + transform.x * coord.x;
var newVertY = sp.y * (1.0f - transform.y) + transform.y * coord.y;
var newVertZ = sp.z * (1.0f - transform.z) + transform.z * coord.z;
var newVert = new Vector3(newVertX, newVertY, newVertZ);
ref_verts.RemoveAt(i);
ref_verts.Insert(i, newVert);
}
}
float Project(float radius, float ordinates, float z)
{
// given two points (0,-radius), (ordinates, z) find the line that goes trough them and get the ordinate of it's intersection with the horizontal axis
return radius * ordinates / (z + radius);
}
}
}