Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算线段与点之间的距离_Java_Geometry - Fatal编程技术网

Java 计算线段与点之间的距离

Java 计算线段与点之间的距离,java,geometry,Java,Geometry,我目前正在用java从头开始开发一个塔防游戏,我正在修改子弹碰撞。为此,我需要计算给定点和线段之间的距离。我已经编写了一个函数来实现这一点,但它通常会给出与其中一个点之间的距离,而这是不应该的 线段类: 公共类线段{ 公共矢量2DP; 公共向量2dk-q; /** *在点P和点Q之间创建线段 *@param p点p *@param q点q */ 公共线段(矢量2DK p、矢量2DK q){ 这个,p=p; 这个。q=q; } /** *计算到点R的距离 *@param r点r *@返回距离 */

我目前正在用java从头开始开发一个塔防游戏,我正在修改子弹碰撞。为此,我需要计算给定点和线段之间的距离。我已经编写了一个函数来实现这一点,但它通常会给出与其中一个点之间的距离,而这是不应该的

线段类:

公共类线段{
公共矢量2DP;
公共向量2dk-q;
/**
*在点P和点Q之间创建线段
*@param p点p
*@param q点q
*/
公共线段(矢量2DK p、矢量2DK q){
这个,p=p;
这个。q=q;
}
/**
*计算到点R的距离
*@param r点r
*@返回距离
*/
公共双距离(矢量2DK r){
//在尝试了感觉像是一切的东西之后,我可能会有点困惑(前面是愚蠢的错误)
Vector2DP差向量=r.subtract(p).toPolar();
Vector2DP差vector2=r.subtract(q).toPolar();
double alpha=差向量.getAngle()-q.subtract(p).getAngle();
double beta=differenceVector2.getAngle()-q.subtract(p.getAngle();
if(alpha-Math.PI/2){
返回p.distanceTo(r);
}else if(beta>Math.PI/2 | | beta<-Math.PI/2){
返回q.distanceTo(r);
}
返回Math.abs(differenceVector.getMagnitude()*Math.sin(alpha));
}
公共静态void main(字符串[]args){
//一种主要的测试方法
//我已经添加了一个例子,塔的子弹正好穿过敌人(但我可能打错了勾号,所以数值可能不适合测试)
Vector2DK linePoint0=新的Vector2DK(339.93541528265237474.7835775987438);
Vector2DK linePoint1=新的Vector2DK(317.79869321314067388.4287303893724);
Vector2DK点=新Vector2DK(290.019420000002400.0);
直线段直线段=新直线段(直线点0、直线点1);
直线=新线(直线点0,直线点1);
System.out.println(线段距离(点));
}
}
我的两个向量类:

公共类Vector2DK实现Vector2D{
私人双x;
私人双y;
公共向量2DK(双x,双y){
这个.x=x;
这个。y=y;
}
公共矢量2DK(矢量2D矢量){
Vector2DK Vector2DK=vector.toKartesian();
x=vector2DK.x;
y=矢量2dk.y;
}
public void copyToSelf(Vector2DK vector){
x=向量x;
y=向量y;
}
@凌驾
公共字符串toString(){
返回字符串.format(“Vector2DK(%s,%s)”,x,y);
}
@凌驾
公共向量2DK Tokartosian(){
返回新向量2dk(x,y);
}
@凌驾
公共向量2DP拓扑(){
返回新矢量2DP(getMagnitude(),getAngle());
}
@凌驾
公共双getAngle(){
返回数学atan2(y,x);
}
@凌驾
公共双倍震级(){
返回Math.sqrt(getMagnitionSquare());
}
@凌驾
公共双getX(){
返回x;
}
@凌驾
公共双盖{
返回y;
}
@凌驾
公共空隙设置角度(双角度){
Vector2DP向量=拓扑();
矢量。设定角(角度);
copyToSelf(vector.tokartosian());
}
@凌驾
公共空间大小(双倍大小){
Vector2DP向量=拓扑();
矢量设定角(幅值);
copyToSelf(vector.tokartosian());
}
@凌驾
公共无效集x(双x){
这个.x=x;
}
@凌驾
公共空间设置(双y){
这个。y=y;
}
@凌驾
公共广场{
返回x*x+y*y;
}
@凌驾
公共双距离到(矢量2D矢量){
返回Math.sqrt(MathFunc.square(x-vector.getX())+MathFunc.square(y-vector.getY());
}
@凌驾
公共空间正常化(){
双倍震级=getMagnitude();
x/=震级;
y/=震级;
}
@凌驾
公共无效反向(){
x=-x;
y=-y;
}
@凌驾
公共矢量2D添加(矢量2D矢量){
返回新的Vector2DK(x+vector.getX(),y+vector.getY());
}
@凌驾
公共向量2D减法(向量2D向量){
返回新的Vector2DK(x-vector.getX(),y-vector.getY());
}
@凌驾
公共矢量2D比例(双值){
返回新的矢量2dk(x*值,y*值);
}
@凌驾
公共void addWith(矢量2D矢量){
x+=vector.getX();
y+=vector.getY();
}
@凌驾
带(矢量2D矢量)的公共空间{
x-=vector.getX();
y-=vector.getY();
}
@凌驾
公共空白比例(双值){
x*=数值;
y*=值;
}
@凌驾
公共双点积(向量2D向量){
返回x*vector.getX()+y*vector.getY();
}
}
以及:

公共类Vector2DP实现Vector2D{
私人双震级;
私人双角度;
公共矢量2DP(双幅、双角度){
这个。震级=震级;
这个角度=角度;
}
公共向量2DP(向量2DP向量){
Vector2DP Vector2DP=vector.toPolar();
this.magnity=vector.magnity;
this.angle=vector.angle;
}
public void copyToSelf(Vector2DP vector){
震级=矢量震级;
角度=矢量角度;
}
@凌驾
公共字符串toString(){
返回String.format(“Vector2DP(%su,%s°)”,幅值,数学角度(角度));
}
@凌驾
公共向量2DK Tokartosian(){
返回新的Vector2DK(getX(),getY());
}
@凌驾
公共媒介
import math

def pt_seg_dist(px, py, qx, qy, rx, ry):
    qpx = qx - px
    qpy = qy - py
    rpx = rx - px
    rpy = ry - py
    if rpx * qpx + rpy * qpy <= 0:
        return math.hypot(rpx, rpy)
    rqx = rx - qx
    rqy = ry - qy
    if rqx * qpx + rqy * qpy >= 0:
        return math.hypot(rqx, rqy)
    return abs(rpx * qpy - rpy * qpx) / math.hypot(qpx, qpy)

print(pt_seg_dist(0, 0, 1, 0, 0.5, 2))
print(pt_seg_dist(0, 0, 1, 0, -2, 2))
print(pt_seg_dist(0, 0, 1, 0, 3, -2))

>>>
2.0
2.8284271247461903
2.8284271247461903