判断点在线段的哪一侧(向量外积计算)
需求:
判断点B在线段SE的哪一侧。
解决方法:用向量外积的形式进行计算(适用于直线)。
- 生成S到E的向量vectorStoE,在生成S到B的向量vectorStoB;
- 然后根据两个向量的外积大小判断;
- 大于0:在右侧;小于0:在左侧;等于0:在线上。
代码实现:
package com.company.direction;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
/**
* @author YiDianDian
*/
public class DirectionTest {
public static void main(String[] args) {
Point startPoint = Point.builder().x(1).y(1).build();
Point endPoint = Point.builder().x(6).y(2).build();
Point vectorStoE = getVector(startPoint, endPoint);
Point basePoint = Point.builder().x(3).y(3).build();
Point vectorStoB = getVector(startPoint, basePoint);
//根据两向量的外积判断点所在的位置。
Double direction = vectorStoE.getX() * vectorStoB.getY() - vectorStoE.getY() * vectorStoB.getX();
if (direction < 0) {
System.out.println("在右侧");
} else if (direction == 0) {
System.out.println("在线上");
} else {
System.out.println("在左侧");
}
}
/**
* 返回向量
*
* @param startPoint
* @param endPoint
* @return
*/
private static Point getVector(Point startPoint, Point endPoint) {
return Point.builder().x(endPoint.getX() - startPoint.getX()).y(endPoint.getY() - startPoint.getY()).build();
}
@Data
@Builder(toBuilder = true)
@AllArgsConstructor
static class Point {
private double x;
private double y;
}
}