/**
* This file is part of OSM2ShareNav
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation.
*
* Copyright (C) 2010 Harald Mueller
*/
package net.sharenav.osmToShareNav.area;
import net.sharenav.osmToShareNav.model.Bounds;
import net.sharenav.osmToShareNav.model.Node;
public class Triangle {
private final Vertex[] vert = new Vertex[3];
public boolean opt = false;
public Triangle(Vertex n1,Vertex n2, Vertex n3) {
getVert()[0] = n1;
getVert()[1] = n2;
getVert()[2] = n3;
}
public boolean isVertexInside(Vertex n){
if (n == getVert()[0] && n == getVert()[1] && n == getVert()[2]) {
return false;
}
float n1 = n.getSideOfVector(getVert()[1], getVert()[0]);
float n2 = n.getSideOfVector(getVert()[2], getVert()[1]);
float n3 = n.getSideOfVector(getVert()[0], getVert()[2]);
if (n1 * n2 > 0.0 && n1 * n3 > 0.0 && n2 * n3 > 0.0) {
return true;
}
return false;
}
@Override
public String toString() {
return new String("tri " + getVert()[0] + getVert()[1] + getVert()[2]);
}
// probably is faster than the getMidpoint(), not used but retain for now
public Vertex getAverageMidpoint() {
float lat = 0f;
float lon = 0f;
for (int i = 0; i < 3; i++) {
lat += getVert()[i].getLat();
lon += getVert()[i].getLon();
}
return new Vertex(lat / 3, lon / 3, 0l);
}
public Vertex getMidpoint() {
float lat = 0f;
float lon = 0f;
float minLat = Float.MAX_VALUE;
float minLon = Float.MAX_VALUE;
float maxLat = -Float.MAX_VALUE;
float maxLon = -Float.MAX_VALUE;
for (int i = 0; i < 3; i++) {
if (getVert()[i].getLat() <= minLat) {
minLat = getVert()[i].getLat();
}
if (getVert()[i].getLat() >= maxLat) {
maxLat = getVert()[i].getLat();
}
if (getVert()[i].getLon() <= minLon) {
minLon = getVert()[i].getLon();
}
if (getVert()[i].getLon() >= maxLon) {
maxLon = getVert()[i].getLon();
}
}
return new Vertex((maxLat - minLat) / 2 + minLat, (maxLon - minLon) / 2 + minLon,0l);
}
public Bounds extendBound(Bounds b) {
if (b == null) {
b = new Bounds();
}
for (int i = 0; i < 3; i++) {
b.extend(getVert()[i].getLat(), getVert()[i].getLon());
}
return b;
}
// /**
// * @param vert the vert to set
// */
// private void setVert(Vertex[] vert) {
// this.vert = vert;
// }
/**
* @return the vert
*/
public Vertex[] getVert() {
return vert;
}
public int equalVert(Triangle other){
int ret = 0;
for (int i = 0;i < 3; i++) {
for (int j = 0;j < 3; j++) {
if (getVert()[i].getNode() == other.getVert()[j].getNode()) {
ret++;
}
}
}
return ret;
}
}