/*
* Copyright (C) 2011-2015, Peter Abeles. All Rights Reserved.
*
* This file is part of Geometric Regression Library (GeoRegression).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package georegression.geometry;
import georegression.struct.point.Point3D_F64;
import georegression.struct.shapes.Box3D_F64;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
*
*
*/
public class UtilPoint3D_F64 {
/**
* Euclidean distance between the two specified points
* @param x0 x-axis on Point 0
* @param y0 y-axis on Point 0
* @param z0 z-axis on Point 0
* @param x1 x-axis on Point 1
* @param y1 y-axis on Point 1
* @param z1 z-axis on Point 1
* @return Euclidean distance
*/
public static double distance( double x0 , double y0 , double z0 ,
double x1 , double y1 , double z1) {
return norm(x1-x0,y1-y0,z1-z0);
}
/**
* Euclidean distance squared between the two specified points
* @param x0 x-axis on Point 0
* @param y0 y-axis on Point 0
* @param z0 z-axis on Point 0
* @param x1 x-axis on Point 1
* @param y1 y-axis on Point 1
* @param z1 z-axis on Point 1
* @return Euclidean distance squared
*/
public static double distanceSq( double x0 , double y0 , double z0 ,
double x1 , double y1 , double z1) {
double dx = x1-x0;
double dy = y1-y0;
double dz = z1-z0;
return dx*dx + dy*dy + dz*dz;
}
public static double norm( double x , double y , double z ) {
return Math.sqrt(x*x + y*y + z*z);
}
public static List<Point3D_F64> copy( List<Point3D_F64> pts ) {
List<Point3D_F64> ret = new ArrayList<Point3D_F64>();
for( Point3D_F64 p : pts ) {
ret.add( p.copy() );
}
return ret;
}
public static void noiseNormal( List<Point3D_F64> pts, double sigma, Random rand ) {
for( Point3D_F64 p : pts ) {
p.x += rand.nextGaussian() * sigma;
p.y += rand.nextGaussian() * sigma;
p.z += rand.nextGaussian() * sigma;
}
}
public static List<Point3D_F64> random( double min, double max, int num, Random rand ) {
List<Point3D_F64> ret = new ArrayList<Point3D_F64>();
double d = max - min;
for( int i = 0; i < num; i++ ) {
Point3D_F64 p = new Point3D_F64();
p.x = rand.nextDouble() * d + min;
p.y = rand.nextDouble() * d + min;
p.z = rand.nextDouble() * d + min;
ret.add( p );
}
return ret;
}
/**
* Computes the mean of the list of points.
*
* @param points List of points
* @param mean (Optional) storage for the mean. Can be null
* @return Mean
*/
public static Point3D_F64 mean( List<Point3D_F64> points , Point3D_F64 mean ) {
if( mean == null )
mean = new Point3D_F64();
double x = 0, y = 0, z = 0;
for( Point3D_F64 p : points ) {
x += p.x;
y += p.y;
z += p.z;
}
mean.x = x / points.size();
mean.y = y / points.size();
mean.z = z / points.size();
return mean;
}
/**
* Computes the mean of the list of points up to element num.
*
* @param points List of points
* @param num use points up to num, exclusive.
* @param mean (Optional) storage for the mean. Can be null
* @return Mean
*/
public static Point3D_F64 mean( List<Point3D_F64> points , int num , Point3D_F64 mean ) {
if( mean == null )
mean = new Point3D_F64();
double x = 0, y = 0, z = 0;
for( int i = 0; i < num; i++ ) {
Point3D_F64 p = points.get(i);
x += p.x;
y += p.y;
z += p.z;
}
mean.x = x / num;
mean.y = y / num;
mean.z = z / num;
return mean;
}
/**
* Finds the minimal volume {@link Box3D_F64} which contains all the points.
*
* @param points Input: List of points.
* @param bounding Output: Bounding box
*/
public static void boundingBox(List<Point3D_F64> points, Box3D_F64 bounding) {
double minX=Double.MAX_VALUE,maxX=-Double.MAX_VALUE;
double minY=Double.MAX_VALUE,maxY=-Double.MAX_VALUE;
double minZ=Double.MAX_VALUE,maxZ=-Double.MAX_VALUE;
for( int i = 0; i < points.size(); i++ ) {
Point3D_F64 p = points.get(i);
if( p.x < minX )
minX = p.x;
if( p.x > maxX )
maxX = p.x;
if( p.y < minY )
minY = p.y;
if( p.y > maxY )
maxY = p.y;
if( p.z < minZ )
minZ = p.z;
if( p.z > maxZ )
maxZ = p.z;
}
bounding.p0.set(minX,minY,minZ);
bounding.p1.set(maxX, maxY, maxZ);
}
}