【问题标题】:Android map v2 polyline intersection pointAndroid地图v2折线交点
【发布时间】:2023-04-04 17:55:01
【问题描述】:

我有一个圆和一条折线,我想知道交点的坐标

【问题讨论】:

  • 您好 user3591040 - 您能否向我们展示您迄今为止所做的尝试,以及具体您遇到问题的地方?

标签: android dictionary


【解决方案1】:

user3591040 相当棘手....

希望你有圆和线相关的资料。

equations and all polylines

你要找到这个点

**

  1. 考虑这张图片 我们将尝试检测任何碰撞

**

碰撞检测算法:尝试实现这个算法

服用

E是射线的起点, L 是射线的终点, C 是您要测试的球心 r 是该球体的半径 计算:

d = L - E ( Direction vector of ray, from start to end )
f = E - C ( Vector from center sphere to ray start )

然后交叉点被.. 堵塞:

P = E + t * d

这是一个参数方程:

Px = Ex + tdx
Py = Ey + tdy

进入

(x - h)2 + (y - k)2 = r2
(h,k) = center of circle.

注意:我们在这里将问题简化为 2D,我们得到的解决方案也适用于 3D 得到:

展开

x2 - 2xh + h2 + y2 - 2yk + k2 - r2 = 0

插头

x = ex + tdx
y = ey + tdy
( ex + tdx )2 - 2( ex + tdx )h + h2 + ( ey + tdy )2 - 2( ey + tdy )k + k2 - r2 = 0
Explode
ex2 + 2extdx + t2dx2 - 2exh - 2tdxh + h2 + ey2 + 2eytdy + t2dy2 - 2eyk - 2tdyk + k2 - r2 = 0
Group
t2( dx2 + dy2 ) + 2t( exdx + eydy - dxh - dyk ) + ex2 + ey2 - 2exh - 2eyk + h2 + k2 - r2 = 0
Finally,
t2( _d * _d ) + 2t( _e * _d - _d * _c ) + _e * _e - 2( _e*_c ) + _c * _c - r2 = 0
*Where _d is the vector d and * is the dot product.*
And then,
t2( _d * _d ) + 2t( _d * ( _e - _c ) ) + ( _e - _c ) * ( _e - _c ) - r2 = 0
Letting _f = _e - _c
t2( _d * _d ) + 2t( _d * _f ) + _f * _f - r2 = 0
So we get:
t2 * (d DOT d) + 2t*( f DOT d ) + ( f DOT f - r2 ) = 0

所以求解二次方程:

float a = d.Dot( d ) ;
float b = 2*f.Dot( d ) ;
float c = f.Dot( f ) - r*r ;

float discriminant = b*b-4*a*c;
if( discriminant < 0 )
{
  // no intersection
}
else
{
  // ray didn't totally miss sphere,
  // so there is a solution to
  // the equation.

  discriminant = sqrt( discriminant );

  // either solution may be on or off the ray so need to test both
  // t1 is always the smaller value, because BOTH discriminant and
  // a are nonnegative.
  float t1 = (-b - discriminant)/(2*a);
  float t2 = (-b + discriminant)/(2*a);

  // 3x HIT cases:
  //          -o->             --|-->  |            |  --|->
  // Impale(t1 hit,t2 hit), Poke(t1 hit,t2>1), ExitWound(t1<0, t2 hit), 

  // 3x MISS cases:
  //       ->  o                     o ->              | -> |
  // FallShort (t1>1,t2>1), Past (t1<0,t2<0), CompletelyInside(t1<0, t2>1)

  if( t1 >= 0 && t1 <= 1 )
  {
    // t1 is the intersection, and it's closer than t2
    // (since t1 uses -b - discriminant)
    // Impale, Poke
    return true ;
  }

【讨论】: