반응형

추가적으로 계속 업데이트 할 예정입니다.

 

두 점 사이 거리

 

 

점과 직선사이 거리

 

 

 

세 점 사이 각도

 

 

 

두 직선 사이의 각도

 

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;
    }
}
반응형