import 'dart:math' as math; import 'package:fis_measure/interfaces/date_types/matrix.dart'; import 'package:fis_measure/interfaces/date_types/point.dart'; import 'package:fis_measure/interfaces/date_types/vector.dart'; class EllipseTest { static void calculateYAxisPoints( DPoint yAxisStart, DPoint yAxisEnd, DPoint xAxisStart, DPoint xAxisEnd, DPoint adjustYAxisPoint, bool keepYAxisLength, ) { var reverseMatrix = DMatrix(); var vertical = DVector(1, 0); var angleAngleBetweenVertical = calculateAngel(xAxisEnd, xAxisStart, vertical); var centroidX = (xAxisStart.x + xAxisEnd.x) * 0.5; var centroidY = (xAxisStart.y + xAxisEnd.y) * 0.5; var centroid = DPoint(centroidX, centroidY); reverseMatrix.rotateAt(angleAngleBetweenVertical, centroid.x, centroid.y); var convertMatrix = reverseMatrix; convertMatrix.invert(); double length; if (adjustYAxisPoint == xAxisEnd) { if (keepYAxisLength) { length = (yAxisStart - yAxisEnd).length / 2; } else { length = (xAxisEnd - xAxisStart).length / 2; } } else { length = distance(xAxisStart, xAxisEnd, adjustYAxisPoint); } var pt3 = DPoint(centroid.x, centroid.y + length); var pt4 = DPoint(centroid.x, centroid.y - length); var yAxisStartTrans = convertMatrix.transformWidthPoint(pt3); var yAxisEndTrans = convertMatrix.transformWidthPoint(pt4); yAxisStart.update(yAxisStartTrans); yAxisStart.update(yAxisEndTrans); } static double calculateAngel(DPoint pt1, DPoint pt2, DVector axis) { DVector xAxis = pt2 - pt1; var angle = DVector.angleBetween(xAxis, axis); return angle; } static double distance(DPoint pt1, DPoint pt2, DPoint pt) { double dis = 0; if (pt1.x == pt2.x) { dis = (pt.x - pt1.x).abs(); return dis; } var lineK = (pt2.y - pt1.y) / (pt2.x - pt1.x); var lineC = (pt2.x * pt1.y - pt1.x * pt2.y) / (pt2.x - pt1.x); dis = (lineK * pt.x - pt.y + lineC).abs() / (math.sqrt(lineK * lineK + 1)); return dis; } }