【问题标题】:How to check if Point is on a diagonal line?如何检查Point是否在对角线上?
【发布时间】:2013-03-15 00:41:13
【问题描述】:

我有一个canvaslines。在click 上,我想检查点击是否在我的行上以突出显示它。

我也有一些rectangles,只需使用正方形的startend point 就可以了。 但是对于diagonal line,我不能使用与线不填充矩形相同的技术。

但我还能如何实现呢? 此外,我还想有一些“偏移量”,这样如果点击足够接近线条,它也会被标记,否则细线可能很难点击。

可能我错过了正确的关键字,因为我肯定不是第一个想要这样做的人。希望你能帮上忙。

【问题讨论】:

标签: java gwt java-canvas


【解决方案1】:

写出直线的方程式:

a*x + b*y + c = 0

然后将您点击的坐标放入这个方程:

distance = a*x1 + b*y1 + c 

(x1, y1) 是您单击的点。如果distance < threshold你点击就行了。

【讨论】:

  • 我有一条两端都终止的线,而不是无限的。这难道不会让我在想象中的线条继续的点击中获得积极的结果吗?
【解决方案2】:

Gabor 是对的,计算两点之间的距离并使用它非常容易。根据 Roger 建议的链接,这里是从 AWT 源代码中提取的一些代码,用于测量两点之间的距离。 http://developer.classpath.org/doc/java/awt/geom/Line2D-source.html

所以,你的代码会是这样的

if (ptLineDist(lineX1,lineY1,lineX2,lineY2,clickX,clickY) < someLimit) 
   clicked=true; 
else clicked=false;

这是 AWT 代码(查看上面的链接以获取许可证)

 521:   /**
 522:    * Measures the square of the shortest distance from the reference point
 523:    * to a point on the infinite line extended from the segment. If the point
 524:    * is on the segment, the result will be 0. If the segment is length 0,
 525:    * the distance is to the common endpoint.
 526:    *
 527:    * @param x1 the first x coordinate of the segment
 528:    * @param y1 the first y coordinate of the segment
 529:    * @param x2 the second x coordinate of the segment
 530:    * @param y2 the second y coordinate of the segment
 531:    * @param px the x coordinate of the point
 532:    * @param py the y coordinate of the point
 533:    * @return the square of the distance from the point to the extended line
 534:    * @see #ptLineDist(double, double, double, double, double, double)
 535:    * @see #ptSegDistSq(double, double, double, double, double, double)
 536:    */
 537:   public static double ptLineDistSq(double x1, double y1, double x2, double y2,
 538:                                     double px, double py)
 539:   {
 540:     double pd2 = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
 541: 
 542:     double x, y;
 543:     if (pd2 == 0)
 544:       {
 545:         // Points are coincident.
 546:         x = x1;
 547:         y = y2;
 548:       }
 549:     else
 550:       {
 551:         double u = ((px - x1) * (x2 - x1) + (py - y1) * (y2 - y1)) / pd2;
 552:         x = x1 + u * (x2 - x1);
 553:         y = y1 + u * (y2 - y1);
 554:       }
 555: 
 556:     return (x - px) * (x - px) + (y - py) * (y - py);
 557:   }
 558: 
 559:   /**
 560:    * Measures the shortest distance from the reference point to a point on
 561:    * the infinite line extended from the segment. If the point is on the
 562:    * segment, the result will be 0. If the segment is length 0, the distance
 563:    * is to the common endpoint.
 564:    *
 565:    * @param x1 the first x coordinate of the segment
 566:    * @param y1 the first y coordinate of the segment
 567:    * @param x2 the second x coordinate of the segment
 568:    * @param y2 the second y coordinate of the segment
 569:    * @param px the x coordinate of the point
 570:    * @param py the y coordinate of the point
 571:    * @return the distance from the point to the extended line
 572:    * @see #ptLineDistSq(double, double, double, double, double, double)
 573:    * @see #ptSegDist(double, double, double, double, double, double)
 574:    */
 575:   public static double ptLineDist(double x1, double y1,
 576:                                    double x2, double y2,
 577:                                    double px, double py)
 578:   {
 579:     return Math.sqrt(ptLineDistSq(x1, y1, x2, y2, px, py));
 580:   }
 581: 

【讨论】:

  • +1,感谢您挖掘代码,我懒得写所有带有线坐标的方程。其实ab可以用1个端点的x坐标和y坐标的差来表示,如示例代码所示。
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多