Segment.java
上传用户:sdzznc
上传日期:2022-07-23
资源大小:51k
文件大小:3k
源码类别:

绘图程序

开发平台:

Java

  1. // Copyright by Scot Drysdale
  2. package cn.edu.nju.software.grapheditor.shape;
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.Point;
  6. public class Segment extends Shape {
  7. public Point startPoint,endPoint;
  8. public Segment(Color c) {
  9. super(c);
  10. // TODO Auto-generated constructor stub
  11. }
  12. public void drawShape(Graphics page) {
  13. page.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
  14. }
  15. // YOU FILL IN INSTANCE VARIABLES AND METHODS.
  16. /**
  17.  * Helper method that returns true if Point p is within a tolerance of given
  18.  * bounding box. Here, the bounding box is given by the coordinates of its
  19.  * left, top, right, and bottom.
  20.  */
  21. private static boolean almostContainsPoint(Point p, int left, int top,
  22. int right, int bottom, double tolerance) {
  23. return p.x >= left - tolerance && p.y >= top - tolerance
  24. && p.x <= right + tolerance && p.y <= bottom + tolerance;
  25. }
  26. // Helper method that returns the distance from Point p to the line
  27. // containing a line segment whose endpoints are given.
  28. private static double distanceToPoint(Point p, int x1, int y1, int x2,
  29. int y2) {
  30. if (x1 == x2) // vertical segment?
  31. return (double) (Math.abs(p.x - x1)); // yes, use horizontal
  32. // distance
  33. else if (y1 == y2) // horizontal segment?
  34. return (double) (Math.abs(p.y - y1)); // yes, use vertical distance
  35. else {
  36. // Here, we know that the segment is neither vertical nor
  37. // horizontal.
  38. // Compute m, the slope of the line containing the segment.
  39. double m = ((double) (y1 - y2)) / ((double) (x1 - x2));
  40. // Compute mperp, the slope of the line perpendicular to the
  41. // segment.
  42. double mperp = -1.0 / m;
  43. // Compute the (x, y) intersection of the line containing the
  44. // segment and the line that is perpendicular to the segment and
  45. // that
  46. // contains Point p.
  47. double x = (((double) y1) - ((double) p.y) - (m * x1) + (mperp * p.x))
  48. / (mperp - m);
  49. double y = m * (x - x1) + y1;
  50. // Return the distance between Point p and (x, y).
  51. return Math.sqrt(Math.pow(p.x - x, 2) + Math.pow(p.y - y, 2));
  52. }
  53. }
  54. public Point getCenter() {
  55. return new Point((startPoint.x+endPoint.x)/2,(startPoint.y+endPoint.y)/2);
  56. }
  57. public boolean containsPoint(Point p) {
  58.    int left=Math.min(startPoint.x,endPoint.x);
  59.      int right=Math.max(startPoint.x,endPoint.x);
  60.      int top=Math.min(startPoint.y,endPoint.y);
  61.      int bottom=Math.max(startPoint.y,endPoint.y);
  62.      return almostContainsPoint(p,left,top,right,bottom,3.0)&&(distanceToPoint(p,startPoint.x,startPoint.y,endPoint.x,endPoint.y)<=3.0);
  63. }
  64. public void move(int deltaX, int deltaY) {
  65. startPoint.x+=deltaX;
  66. endPoint.x+=deltaX;
  67. startPoint.y+=deltaY;
  68. endPoint.y+=deltaY;
  69. }
  70. }