ellipse.dart 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import 'dart:math' as math;
  2. import 'package:fis_measure/interfaces/date_types/matrix.dart';
  3. import 'package:fis_measure/interfaces/date_types/point.dart';
  4. import 'package:fis_measure/interfaces/date_types/vector.dart';
  5. class EllipseTest {
  6. static void calculateYAxisPoints(
  7. DPoint yAxisStart,
  8. DPoint yAxisEnd,
  9. DPoint xAxisStart,
  10. DPoint xAxisEnd,
  11. DPoint adjustYAxisPoint,
  12. bool keepYAxisLength,
  13. ) {
  14. var reverseMatrix = DMatrix();
  15. var vertical = DVector(1, 0);
  16. var angleAngleBetweenVertical =
  17. calculateAngel(xAxisEnd, xAxisStart, vertical);
  18. var centroidX = (xAxisStart.x + xAxisEnd.x) * 0.5;
  19. var centroidY = (xAxisStart.y + xAxisEnd.y) * 0.5;
  20. var centroid = DPoint(centroidX, centroidY);
  21. reverseMatrix.rotateAt(angleAngleBetweenVertical, centroid.x, centroid.y);
  22. var convertMatrix = reverseMatrix;
  23. convertMatrix.invert();
  24. double length;
  25. if (adjustYAxisPoint == xAxisEnd) {
  26. if (keepYAxisLength) {
  27. length = (yAxisStart - yAxisEnd).length / 2;
  28. } else {
  29. length = (xAxisEnd - xAxisStart).length / 2;
  30. }
  31. } else {
  32. length = distance(xAxisStart, xAxisEnd, adjustYAxisPoint);
  33. }
  34. var pt3 = DPoint(centroid.x, centroid.y + length);
  35. var pt4 = DPoint(centroid.x, centroid.y - length);
  36. var yAxisStartTrans = convertMatrix.transformWidthPoint(pt3);
  37. var yAxisEndTrans = convertMatrix.transformWidthPoint(pt4);
  38. yAxisStart.update(yAxisStartTrans);
  39. yAxisStart.update(yAxisEndTrans);
  40. }
  41. static double calculateAngel(DPoint pt1, DPoint pt2, DVector axis) {
  42. DVector xAxis = pt2 - pt1;
  43. var angle = DVector.angleBetween(xAxis, axis);
  44. return angle;
  45. }
  46. static double distance(DPoint pt1, DPoint pt2, DPoint pt) {
  47. double dis = 0;
  48. if (pt1.x == pt2.x) {
  49. dis = (pt.x - pt1.x).abs();
  50. return dis;
  51. }
  52. var lineK = (pt2.y - pt1.y) / (pt2.x - pt1.x);
  53. var lineC = (pt2.x * pt1.y - pt1.x * pt2.y) / (pt2.x - pt1.x);
  54. dis = (lineK * pt.x - pt.y + lineC).abs() / (math.sqrt(lineK * lineK + 1));
  55. return dis;
  56. }
  57. }