2022-04-05 14:52:18 +03:00

49 lines
1.4 KiB
Java

package com.alterdekim.rendering;
public class Triangle extends Object3D {
private Vector3 a;
private Vector3 b;
private Vector3 c;
public Triangle(Vector3 position, Vector3 a, Vector3 b, Vector3 c) {
super(position);
this.a = a;
this.b = b;
this.c = c;
}
@Override
public double calculateSDF(Vector3 p) {
if( this.getEulerX() != 0 ) {
p = p.cross(Utils.rotateX(Math.toRadians(this.getEulerX())));
}
if( this.getEulerY() != 0 ) {
p = p.cross(Utils.rotateY(Math.toRadians(this.getEulerY())));
}
if( this.getEulerZ() != 0 ) {
p = p.cross(Utils.rotateZ(Math.toRadians(this.getEulerZ())));
}
Vector3 ba = b.subtract(a); Vector3 pa = p.subtract(a);
Vector3 cb = c.subtract(b); Vector3 pb = p.subtract(b);
Vector3 ac = a.subtract(c); Vector3 pc = p.subtract(c);
Vector3 nor = ba.cross(ac);
return Math.sqrt(
(Math.signum(ba.cross(nor).dot(pa)) +
Math.signum(cb.cross(nor).dot(pb)) +
Math.signum(ac.cross(nor).dot(pc))<2.0)
?
Math.min( Math.min(
dot2(ba.multiply(Utils.clamp(ba.dot(pa)/dot2(ba),0.0,1.0)).subtract(pa)),
dot2(cb.multiply(Utils.clamp(cb.dot(pb)/dot2(cb),0.0,1.0)).subtract(pb)) ),
dot2(ac.multiply(Utils.clamp(ac.dot(pc)/dot2(ac),0.0,1.0)).subtract(pc)) )
:
nor.dot(pa)*nor.dot(pa)/dot2(nor) );
}
private double dot2( Vector3 v ) {
return v.dot(v);
}
}