2013-03-25 108 views
2

我有一个canvaslines。在click我想检查点击是否在我的线上来突出显示它。如何检查点是否在对角线上?

我也有一些rectangles在哪里很容易,只需使用广场的startend point。 但是对于一个diagonal line我不能使用相同的技术,当然一行不填充矩形。

但我怎么能实现呢? 此外,我想也有一些“偏移”,以便如果点击距离线很近,它也被标记,因为细线可能很难点击,否则。

也许我错过了正确的关键词,因为我肯定不是第一个想做这个的人。希望你能帮忙。

+1

有什么好? http://stackoverflow.com/a/9114951/2065121 – 2013-03-25 13:43:30

+0

gwt罗杰没有awt,但你可以提取代码。 – 2013-03-25 13:52:09

回答

3

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

所以,你的代码会像

​​

这里的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: 
+0

+1,感谢您挖掘代码,我懒得写出所有的线性坐标方程。实际上,您可以使用示例代码中所示的1个端点的x和y坐标差来表示a和b。 – gaborsch 2013-03-25 14:06:43

4

写出方程式行:

a*x + b*y + c = 0 

然后把你的坐标点击了该公式:

distance = a*x1 + b*y1 + c 

其中(x1, y1)是您单击的点。如果distance < threshold您点击了该行。

+0

我有一条线在两端终止,而不是无限的。这不会给我一个积极的结果点击线路想象会继续? – membersound 2013-03-25 14:09:12