我有一个canvas
. lines
在click
我想检查点击是否在我的线上以突出显示它。
我也有一些rectangles
通过使用start
和end point
广场很容易的地方。但是对于我来说,diagonal line
我不能使用与一条线不填充矩形相同的技术。
但是我怎么能做到这一点呢?此外,我还想有一些“偏移”,这样如果点击足够接近线,它也会被标记,否则细线可能很难点击。
可能我错过了正确的关键字,因为我肯定不是第一个想要这样做的人。希望你能帮忙。
我有一个canvas
. lines
在click
我想检查点击是否在我的线上以突出显示它。
我也有一些rectangles
通过使用start
和end point
广场很容易的地方。但是对于我来说,diagonal line
我不能使用与一条线不填充矩形相同的技术。
但是我怎么能做到这一点呢?此外,我还想有一些“偏移”,这样如果点击足够接近线,它也会被标记,否则细线可能很难点击。
可能我错过了正确的关键字,因为我肯定不是第一个想要这样做的人。希望你能帮忙。
写出直线的方程:
a*x + b*y + c = 0
然后将您单击的坐标放入此等式:
distance = a*x1 + b*y1 + c
(x1, y1)
您单击的点在哪里。如果distance < threshold
你点击就行了。
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: