/** @filke Triangle.java * * @author marco corvi * @date nov 2014 * * @brief TopoDroid 3 vector triangle * -------------------------------------------------------- * Copyright This sowftare is distributed under GPL-3.0 or later * See the file COPYING. * -------------------------------------------------------- * This software is adapted from TopoLinux implementation, * which, in turns, is based on PocketTopo implementation. * -------------------------------------------------------- */ package com.topodroid.DistoX; import java.lang.Math; import android.util.Log; public class Triangle { boolean valid; public Vector mA, mB, mC; public Vector mN; // unit normal Triangle( Vector a, Vector b, Vector c ) { valid = true; mA = a; mB = b; mC = c; Vector v1 = mB.minus( mA ); Vector v2 = mC.minus( mA ); mN = v1.cross( v2 ); mN.normalize(); } float signedDistance( Vector p ) { return mN.dot( p.minus(mA) ); } boolean isPositive( Vector p ) { return signedDistance(p) > 0.0000001f; } Triangle[] refineAtCenter() { Vector p = mA.plus( mB ).plus( mC ); p.timesEqual( 1.0f/3.0f ); Triangle[] ret = new Triangle[3]; ret[0] = new Triangle( mA, mB, p ); ret[1] = new Triangle( mB, mC, p ); ret[2] = new Triangle( mC, mA, p ); return ret; } Triangle[] refineAtSides() { Vector a = mB.plus( mC ); a.timesEqual( 0.5f ); Vector b = mC.plus( mA ); b.timesEqual( 0.5f ); Vector c = mA.plus( mB ); c.timesEqual( 0.5f ); Triangle[] ret = new Triangle[4]; ret[0] = new Triangle( a, b, c ); ret[1] = new Triangle( mA, c, b ); ret[2] = new Triangle( mB, a, c ); ret[3] = new Triangle( mC, b, a ); return ret; } Triangle[] refineAtVertex( Vector p ) { Triangle[] ret = new Triangle[3]; Vector va=null, vb=null, vc=null; if ( p == mA ) { va = mA; vb = mB; vc = mC; } else if ( p == mB ) { va = mB; vb = mC; vc = mA; } else if ( p == mC ) { va = mC; vb = mA; vc = mB; } else { return null; } // Vector a = vb.plus( vc ); a.timesEqual( 0.5f ); Vector b = vc.plus( va ); b.timesEqual( 0.5f ); Vector c = va.plus( vb ); c.timesEqual( 0.5f ); ret[0] = new Triangle( va, c, b ); if ( va.distance( vb ) > va.distance( vc ) ) { ret[1] = new Triangle( vb, b, c ); ret[2] = new Triangle( vb, vc, b ); } else { ret[1] = new Triangle( vc, b, c ); ret[2] = new Triangle( vb, vc, c ); } return ret; } }