判断点在三角形内还是三角形外 ? ? ?

闲话不多说, 自己画个图形, 判断一下它们之间的规律, 其实比较容易写出来.

当前有两种方法:

方法一: 判断点P, 如果在三角形内, 则三角形的每个点和P点必在对应三角形边长的同一侧. 根据这个 "点" 同一侧判断.代码如下:

package sdkdemo.demo.com.lib.method;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by  sjx  on 2020/9/9
 */
public class TriangleArea {


    public void solution() {
        List<List<Integer>> list      = new ArrayList<>();
        List<Integer>       oneList   = new ArrayList<>();
        List<Integer>       twoList   = new ArrayList<>();
        List<Integer>       threeList = new ArrayList<>();

        oneList.add(0);
        oneList.add(0);
        twoList.add(2);
        twoList.add(0);
        threeList.add(1);
        threeList.add(2);

        list.add(oneList);
        list.add(twoList);
        list.add(threeList);

        int[] point = new int[]{1, 1};
        String str = castMagic(list, point);
        System.out.println("castMagic : " + str);
    }

    /**
     * [[0,0],[2,0],[1,2]]
     * [1,1]
     *
     * @param list
     * @param point
     * @return
     */
    public String castMagic(List<List<Integer>> list, int[] point) {
        List<Integer> oneList   = list.get(0);
        List<Integer> twoList   = list.get(1);
        List<Integer> threeList = list.get(2);

        int aX = oneList.get(0);
        int aY = oneList.get(1);

        int bX = twoList.get(0);
        int bY = twoList.get(1);

        int cX = threeList.get(0);
        int cY = threeList.get(1);

        int pointX = point[0];
        int pointY = point[1];

        float abRate = (float) (1.0 * (aY - bY) / (aX - bX));
        float abDex  = aY - aX * abRate;

        float acRate = (float) (1.0 * (aY - cY) / (aX - cX));
        float acDex  = aY - aX * acRate;

        float bcRate = (float) (1.0 * (bY - cY) / (bX - cX));
        float bcDex  = bY - bX * bcRate;


        float abPointY = pointX * abRate + abDex;
        float acPointY = pointX * acRate + acDex;
        float bcPointY = pointX * bcRate + bcDex;

        float cTempY = cX * abRate + abDex;
        float bTempY = bX * acRate + acDex;
        float aTempY = aX * bcRate + bcDex;

        if ((pointY - abPointY) * (cY - cTempY) >= 0
                && (pointY - acPointY) * (bY - bTempY) >= 0
                && (pointY - bcPointY) * (aY - aTempY) >= 0) {
            return "YES";
        }else{
            return "NO";
        }

    }
}

 

方法二:

根据面积; 点P到三角形各个点之间, 组成包含P点的三角形面积之和, 与原有三角形面积的比较.   注意: 由于计算出来的是浮点型数值, 没发用 "==" 直接比较. 那就只好取精度, 比如两个面积之差小于 0.000000001这种, 甚至0.00000...1 

package sdkdemo.demo.com.lib.method;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by  sjx  on 2020/9/9
 */
public class TriangleAreaPoint {
    public void solution() {
        List<List<Integer>> list      = new ArrayList<>();
        List<Integer>       oneList   = new ArrayList<>();
        List<Integer>       twoList   = new ArrayList<>();
        List<Integer>       threeList = new ArrayList<>();

        oneList.add(0);
        oneList.add(0);
        twoList.add(2);
        twoList.add(0);
        threeList.add(1);
        threeList.add(2);

        list.add(oneList);
        list.add(twoList);
        list.add(threeList);

        int[]  point = new int[]{1, 1};
        String str   = castMagic(list, point);
        System.out.println("castMagic : " + str);
    }

    /**
     * [[0,0],[2,0],[1,2]]
     * [1,1]
     *
     * @param list
     * @param point
     * @return
     */
    public String castMagic(List<List<Integer>> list, int[] point) {
        List<Integer> oneList   = list.get(0);
        List<Integer> twoList   = list.get(1);
        List<Integer> threeList = list.get(2);

        int aX = oneList.get(0);
        int aY = oneList.get(1);

        int bX = twoList.get(0);
        int bY = twoList.get(1);

        int cX = threeList.get(0);
        int cY = threeList.get(1);

        int           pointX = point[0];
        int           pointY = point[1];
        List<Integer> pList  = new ArrayList<>();
        pList.add(pointX);
        pList.add(pointY);


        double ab = getSideLength(oneList, twoList);
        double ac = getSideLength(oneList, threeList);
        double bc = getSideLength(twoList, threeList);

        double pa = getSideLength(pList, oneList);
        double pb = getSideLength(pList, twoList);
        double pc = getSideLength(pList, threeList);

        double area = getArea(ab, ac, bc);

        double p1 = getArea(pa, pb, ab);
        double p2 = getArea(pa, pc, ac);
        double p3 = getArea(pc, pb, bc);

        if (Math.abs(area - p1 - p2 - p3) < 0.000000001){
            return "YES";
        }

        return "NO";
    }

    private double getArea(double a, double b, double c) {
        double perimeterHalf = (a + b + c) / 2;
        double area          = Math.sqrt(perimeterHalf * (perimeterHalf - a) * (perimeterHalf - b) * (perimeterHalf - c));
        return area;
    }

    private double getSideLength(List<Integer> aList, List<Integer> bList) {
        int aX = aList.get(0);
        int aY = aList.get(1);

        int bX = bList.get(0);
        int bY = bList.get(1);

        double sqrt = Math.sqrt(Math.pow(aX - bX, 2) + Math.pow(aY - bY, 2));

        return sqrt;
    }
}

 

个人感觉, 还是计算面积这种判断起来比较简单. 同一侧点的判断真心比较麻烦....

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值