반응형
추가적으로 계속 업데이트 할 예정입니다.
두 점 사이 거리
점과 직선사이 거리
세 점 사이 각도
두 직선 사이의 각도
import java.awt.*;
public class Crocus {
public static void main(String[] args) {
/**
* 두 점사이 거리
*/
Point p1 = new Point(1,1);
Point p2 = new Point(3,3);
float dist = getDistanceBetweenTwoPoints(p1,p2);
System.out.println(dist);
/**
* 점과 직선사이 거리
*/
Point a = new Point(1,1);
Point b = new Point(3,3);
Point p = new Point(0,2);
dist = getDistanceOfPointFromALine(a, b, p);
System.out.println(dist);
/**
* 세 점 사이 각도
*/
p1 = new Point(2,2);
p2 = new Point(1,1);
Point p3 = new Point(1,2);
float degree = getAngleFromThreePoints(p1,p2,p3);
System.out.println(degree);
/**
* 두 직선 사이 각도
*/
p1 = new Point(0,0);
p2 = new Point(3,0);
p3 = new Point(2,2);
Point p4 = new Point(5,5);
float m12 = (float)(p2.y - p1.y) / (float)(p2.x - p1.x);
float m34 = (float)(p4.y - p3.y) / (float)(p4.x - p3.x);
degree = getAngleBetweenTwoLines(m12, m34);
System.out.println(degree);
}
/**
* 두 점사이의 거리를 반환한다.
* @param p1 점 1.
* @param p2 점 2.
* @return 두 점사이의 거리를 반환.
*/
public static float getDistanceBetweenTwoPoints(Point p1, Point p2){
float dist = (float) Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
return dist;
}
/**
* 점과 직선사이 거리를 반환한다.
* a,b는 직선을 이루는 점들이고 p는 직선사이의 거리를 구하기 위한 점에 해당한다.
* @param a 직선을 이루는 점 1.
* @param b 직선을 이루는 점 2.
* @param p 직선과의 거리를 구하기 위한 점.
* @return 점과 직선사이의 거리를 반환.
*/
public static float getDistanceOfPointFromALine(Point a, Point b, Point p){
float m = (float)(b.y - a.y) / (float)(b.x - a.x);
/**
* y = m * (x - a.x) + a.y ->
* m*x - m*a.x + a.y - y = 0 ->
* y - m*x + m*a.x - a.y = 0
*
* Then, d = |ax1 + by1 + c| / sqrt(a^2 + b^2) ->
* d = |ax1 + y1 + c| / sqrt(1 + m^2)
*/
float dist = (float) (Math.abs(-m * p.x + p.y + m * a.x - a.y) / Math.sqrt(1 + Math.pow(m, 2)));
return dist;
}
/**
* 세 점사이의 각도를 반환한다.
* 이때 p1, p2, p3중 p2가 가운데 점으로 사용된다.
* radian 혹은 degree로 반환 할 수 있다.
*
* @param p1 사이드 점 1.
* @param p2 가운데 점.
* @param p3 사이드 점 2.
* @return 세 점이 이루는 각도를 반환.
*/
public static float getAngleFromThreePoints(Point p1, Point p2, Point p3){
float p12 = (float) Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
float p23 = (float) Math.sqrt(Math.pow(p2.x - p3.x, 2) + Math.pow(p2.y - p3.y, 2));
float p31 = (float) Math.sqrt(Math.pow(p3.x - p1.x, 2) + Math.pow(p3.y - p1.y, 2));
float radian = (float) Math.acos((p12*p12 + p23*p23 - p31*p31) / (2 * p12 * p23));
float degree = (float) (radian / Math.PI * 180);
return degree;
}
/**
* 두 직선 사이의 각도를 반환한다.
* 두 직선 사이에는 총 4개의 각도가 생길 수 있으니 상황에 맞게 계산하여준다.
*
* @param m1 직선 1의 기울기.
* @param m2 직선 2의 기울기.
* @return 직선 1, 2 사이의 각도를 반환.
*/
public static float getAngleBetweenTwoLines(float m1, float m2){
float m = (m1 - m2) / (1 + m1 * m2);
float radian = (float) Math.atan(m); // or (float) -Math.atan(m)
float degree = (float) (radian / Math.PI * 180);
return degree;
}
}
반응형
'Applied > 알고리즘' 카테고리의 다른 글
2차원 좌표 차원축소 알고리즘 (0) | 2024.02.28 |
---|---|
중위 표기법을 후위 표기법으로 변환후 계산하기 (1) | 2021.01.02 |
시계방향, 반시계 방향 좌표 정렬 (0) | 2019.12.31 |
다각형 내부 외부 판별 알고리즘 (0) | 2019.11.15 |
힙(Heap) 좀더 깔끔하게 짠 코드 (0) | 2019.07.19 |