10class GeometryUtilsExample {
11 GeometryUtilsExample() {
12 _demonstrateGeometryUtilsMethods();
18 void _demonstrateGeometryUtilsMethods() {
19 print(
"=== GeometryUtils Methods ===");
21 _demonstratePointOperations();
22 _demonstrateGlobalPointOperations();
23 _demonstrateSegmentOperations();
24 _demonstratePolygonOperations();
25 _demonstrateLineOperations();
26 _demonstrateAdvancedGeometryOperations();
32 void _demonstratePointOperations() {
33 print(
"--- Point Operations ---");
37 Point point1 = Point(10.0, 20.0);
38 Point point2 = Point(30.0, 40.0);
39 Point point3 = Point(50.0, 60.0);
40 print(
"Created points: P1(${point1.x}, ${point1.y}), P2(${point2.x}, ${point2.y}), P3(${point3.x}, ${point3.y})");
46 print(
"Point1 X coordinate: $x1");
52 print(
"Point1 Y coordinate: $y1");
57 double distance = GeometryUtils.distanceBetweenPoints(point1, point2);
58 print(
"Distance between P1 and P2: ${distance.toStringAsFixed(2)} meters");
62 List<Point> testPoints = [
70 print(
"Test points created for further calculations");
76 void _demonstrateGlobalPointOperations() {
77 print(
"--- GlobalPoint Operations ---");
81 GlobalPoint globalPoint1 = GlobalPoint(55.7558, 37.6176);
82 GlobalPoint globalPoint2 = GlobalPoint(59.9311, 30.3609);
83 GlobalPoint globalPoint3 = GlobalPoint(55.7522, 37.6156);
84 print(
"Created global points: GP1(${globalPoint1.latitude}, ${globalPoint1.longitude}), GP2(${globalPoint2.latitude}, ${globalPoint2.longitude})");
89 double lat1 = globalPoint1.latitude;
90 print(
"GlobalPoint1 latitude: $lat1");
95 double lon1 = globalPoint1.longitude;
96 print(
"GlobalPoint1 longitude: $lon1");
101 double globalDistance = GeometryUtils.distanceBetweenGlobalPoints(globalPoint1, globalPoint2);
102 print(
"Distance between Moscow and St. Petersburg: ${globalDistance.toStringAsFixed(2)} meters");
106 double nearbyDistance = GeometryUtils.distanceBetweenGlobalPoints(globalPoint1, globalPoint3);
107 print(
"Distance between Moscow points: ${nearbyDistance.toStringAsFixed(2)} meters");
113 void _demonstrateSegmentOperations() {
114 print(
"--- Segment Operations ---");
117 Point start1 = Point(0.0, 0.0);
118 Point end1 = Point(10.0, 10.0);
119 Point start2 = Point(0.0, 10.0);
120 Point end2 = Point(10.0, 0.0);
121 Point testPoint = Point(5.0, 5.0);
125 Segment segment1 = Segment(start1, end1);
126 Segment segment2 = Segment(start2, end2);
127 print(
"Created segments: S1((${segment1.start.x}, ${segment1.start.y}) -> (${segment1.end.x}, ${segment1.end.y})), S2((${segment2.start.x}, ${segment2.start.y}) -> (${segment2.end.x}, ${segment2.end.y}))");
132 Point segment1Start = segment1.start;
133 print(
"Segment1 start point: (${segment1Start.x}, ${segment1Start.y})");
138 Point segment1End = segment1.end;
139 print(
"Segment1 end point: (${segment1End.x}, ${segment1End.y})");
144 double length1 = GeometryUtils.segmentLength(segment1);
145 double length2 = GeometryUtils.segmentLength(segment2);
146 print(
"Segment1 length: ${length1.toStringAsFixed(2)} meters");
147 print(
"Segment2 length: ${length2.toStringAsFixed(2)} meters");
152 double distanceToPoint = GeometryUtils.segmentPointDistance(segment1, testPoint);
153 print(
"Distance from segment1 to test point: ${distanceToPoint.toStringAsFixed(2)} meters");
158 bool intersects = GeometryUtils.segmentIntersectsSegment(segment1, segment2);
159 print(
"Segments intersect: $intersects");
164 Point intersection = GeometryUtils.segmentIntersectionSegment(segment1, segment2);
165 print(
"Intersection point: (${intersection.x.toStringAsFixed(2)}, ${intersection.y.toStringAsFixed(2)})");
170 double divisionRatio = GeometryUtils.divisionRatioBySegment(segment1, segment2);
171 print(
"Division ratio: ${divisionRatio.toStringAsFixed(2)}");
177 Point ratioPoint = GeometryUtils.getRatioPoint(segment1, ratio);
178 print(
"Point at ratio $ratio: (${ratioPoint.x.toStringAsFixed(2)}, ${ratioPoint.y.toStringAsFixed(2)})");
183 double projectionRatio = GeometryUtils.getProjectionRatio(segment1, testPoint);
184 print(
"Projection ratio: ${projectionRatio.toStringAsFixed(2)}");
191 void _demonstratePolygonOperations() {
192 print(
"--- Polygon Operations ---");
195 List<Point> polygonPoints = [
204 Polygon polygon = Polygon(polygonPoints);
205 print(
"Created polygon with ${polygon.points.length} points");
210 List<Point> points = polygon.points;
211 print(
"Polygon points: ${points.map((p) => "(${p.x}, ${p.y})
").join(",
")}");
216 double area = GeometryUtils.polygonArea(polygon);
217 print(
"Polygon area: ${area.toStringAsFixed(2)} square meters");
222 Point center = GeometryUtils.polygonCenter(polygon);
223 print(
"Polygon center: (${center.x.toStringAsFixed(2)}, ${center.y.toStringAsFixed(2)})");
228 Point insidePoint = Point(5.0, 5.0);
229 Point outsidePoint = Point(15.0, 15.0);
231 bool containsInside = GeometryUtils.polygonContainsPoint(polygon, insidePoint);
232 bool containsOutside = GeometryUtils.polygonContainsPoint(polygon, outsidePoint);
234 print(
"Polygon contains inside point: $containsInside");
235 print(
"Polygon contains outside point: $containsOutside");
239 List<Point> complexPolygonPoints = [
246 Polygon complexPolygon = Polygon(complexPolygonPoints);
248 double complexArea = GeometryUtils.polygonArea(complexPolygon);
249 Point complexCenter = GeometryUtils.polygonCenter(complexPolygon);
251 print(
"Complex polygon area: ${complexArea.toStringAsFixed(2)} square meters");
252 print(
"Complex polygon center: (${complexCenter.x.toStringAsFixed(2)}, ${complexCenter.y.toStringAsFixed(2)})");
258 void _demonstrateLineOperations() {
259 print(
"--- Line Operations ---");
262 List<Segment> lineSegments = [
263 Segment(Point(0.0, 0.0), Point(10.0, 10.0)),
264 Segment(Point(10.0, 10.0), Point(20.0, 5.0)),
265 Segment(Point(20.0, 5.0), Point(30.0, 15.0)),
270 Line line = Line(lineSegments);
271 print(
"Created line with ${line.segments.length} segments");
276 List<Segment> segments = line.segments;
277 print(
"Line segments: ${segments.length} segments");
281 double totalLength = 0.0;
282 for (Segment segment in segments) {
283 totalLength += GeometryUtils.segmentLength(segment);
285 print(
"Total line length: ${totalLength.toStringAsFixed(2)} meters");
288 List<Segment> complexLineSegments = [
289 Segment(Point(0.0, 0.0), Point(5.0, 5.0)),
290 Segment(Point(5.0, 5.0), Point(10.0, 0.0)),
291 Segment(Point(10.0, 0.0), Point(15.0, 10.0)),
292 Segment(Point(15.0, 10.0), Point(20.0, 5.0)),
294 Line complexLine = Line(complexLineSegments);
296 double complexTotalLength = 0.0;
297 for (Segment segment in complexLine.segments) {
298 complexTotalLength += GeometryUtils.segmentLength(segment);
300 print(
"Complex line total length: ${complexTotalLength.toStringAsFixed(2)} meters");
306 void _demonstrateAdvancedGeometryOperations() {
307 print(
"--- Advanced Geometry Operations ---");
310 _demonstrateDistanceCalculations();
313 _demonstrateIntersectionScenarios();
316 _demonstratePolygonScenarios();
319 _demonstrateProjectionCalculations();
325 void _demonstrateDistanceCalculations() {
326 print(
"--- Distance Calculations ---");
329 Point origin = Point(0.0, 0.0);
330 List<Point> testPoints = [
336 for (Point testPoint in testPoints) {
337 double distance = GeometryUtils.distanceBetweenPoints(origin, testPoint);
338 print(
"Distance from origin to (${testPoint.x}, ${testPoint.y}): ${distance.toStringAsFixed(2)} meters");
342 GlobalPoint moscow = GlobalPoint(55.7558, 37.6176);
343 GlobalPoint london = GlobalPoint(51.5074, -0.1278);
344 GlobalPoint tokyo = GlobalPoint(35.6762, 139.6503);
346 double moscowLondon = GeometryUtils.distanceBetweenGlobalPoints(moscow, london);
347 double moscowTokyo = GeometryUtils.distanceBetweenGlobalPoints(moscow, tokyo);
349 print(
"Moscow to London: ${(moscowLondon / 1000).toStringAsFixed(2)} km");
350 print(
"Moscow to Tokyo: ${(moscowTokyo / 1000).toStringAsFixed(2)} km");
356 void _demonstrateIntersectionScenarios() {
357 print(
"--- Intersection Scenarios ---");
360 Segment parallel1 = Segment(Point(0.0, 0.0), Point(10.0, 0.0));
361 Segment parallel2 = Segment(Point(0.0, 5.0), Point(10.0, 5.0));
363 bool parallelIntersects = GeometryUtils.segmentIntersectsSegment(parallel1, parallel2);
364 print(
"Parallel segments intersect: $parallelIntersects");
367 Segment perpendicular1 = Segment(Point(0.0, 0.0), Point(10.0, 0.0));
368 Segment perpendicular2 = Segment(Point(5.0, -5.0), Point(5.0, 5.0));
370 bool perpendicularIntersects = GeometryUtils.segmentIntersectsSegment(perpendicular1, perpendicular2);
371 print(
"Perpendicular segments intersect: $perpendicularIntersects");
373 if (perpendicularIntersects) {
374 Point intersection = GeometryUtils.segmentIntersectionSegment(perpendicular1, perpendicular2);
375 print(
"Intersection point: (${intersection.x.toStringAsFixed(2)}, ${intersection.y.toStringAsFixed(2)})");
379 Segment overlap1 = Segment(Point(0.0, 0.0), Point(10.0, 0.0));
380 Segment overlap2 = Segment(Point(5.0, 0.0), Point(15.0, 0.0));
382 bool overlapIntersects = GeometryUtils.segmentIntersectsSegment(overlap1, overlap2);
383 print(
"Overlapping segments intersect: $overlapIntersects");
389 void _demonstratePolygonScenarios() {
390 print(
"--- Polygon Scenarios ---");
393 List<Point> square = [
399 Polygon squarePolygon = Polygon(square);
401 double squareArea = GeometryUtils.polygonArea(squarePolygon);
402 Point squareCenter = GeometryUtils.polygonCenter(squarePolygon);
404 print(
"Square area: ${squareArea.toStringAsFixed(2)} square meters");
405 print(
"Square center: (${squareCenter.x.toStringAsFixed(2)}, ${squareCenter.y.toStringAsFixed(2)})");
408 List<Point> triangle = [
413 Polygon trianglePolygon = Polygon(triangle);
415 double triangleArea = GeometryUtils.polygonArea(trianglePolygon);
416 Point triangleCenter = GeometryUtils.polygonCenter(trianglePolygon);
418 print(
"Triangle area: ${triangleArea.toStringAsFixed(2)} square meters");
419 print(
"Triangle center: (${triangleCenter.x.toStringAsFixed(2)}, ${triangleCenter.y.toStringAsFixed(2)})");
422 Point insideSquare = Point(5.0, 5.0);
423 Point outsideSquare = Point(15.0, 15.0);
425 bool containsInside = GeometryUtils.polygonContainsPoint(squarePolygon, insideSquare);
426 bool containsOutside = GeometryUtils.polygonContainsPoint(squarePolygon, outsideSquare);
428 print(
"Square contains (5,5): $containsInside");
429 print(
"Square contains (15,15): $containsOutside");
435 void _demonstrateProjectionCalculations() {
436 print(
"--- Projection Calculations ---");
438 Segment segment = Segment(Point(0.0, 0.0), Point(10.0, 10.0));
441 List<double> ratios = [0.0, 0.25, 0.5, 0.75, 1.0];
443 for (
double ratio in ratios) {
444 Point ratioPoint = GeometryUtils.getRatioPoint(segment, ratio);
445 print(
"Ratio $ratio: (${ratioPoint.x.toStringAsFixed(2)}, ${ratioPoint.y.toStringAsFixed(2)})");
449 Point testPoint = Point(5.0, 5.0);
450 double projectionRatio = GeometryUtils.getProjectionRatio(segment, testPoint);
451 print(
"Projection ratio for point (5,5): ${projectionRatio.toStringAsFixed(2)}");
454 Point offSegmentPoint = Point(5.0, 0.0);
455 double distanceToOffPoint = GeometryUtils.segmentPointDistance(segment, offSegmentPoint);
456 print(
"Distance from segment to point (5,0): ${distanceToOffPoint.toStringAsFixed(2)} meters");
462 Future<void> runExample() async {
463 print(
"=== GeometryUtils Example ===");
466 await Future.delayed(Duration(seconds: 1));
468 print(
"=== Example completed ===");