MCPcopy Create free account
hub / github.com/TheForceEngine/TheForceEngine / IntersectPoint

Function IntersectPoint

TheForceEngine/TFE_Polygon/clipper.cpp:622–689  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

620//------------------------------------------------------------------------------
621
622void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip)
623{
624#ifdef use_xyz
625 ip.Z = 0;
626#endif
627
628 double b1, b2;
629 if (Edge1.Dx == Edge2.Dx)
630 {
631 ip.Y = Edge1.Curr.Y;
632 ip.X = TopX(Edge1, ip.Y);
633 return;
634 }
635 else if (Edge1.Dx == 0)
636 {
637 ip.X = Edge1.Bot.X;
638 if (IsHorizontal(Edge2))
639 ip.Y = Edge2.Bot.Y;
640 else
641 {
642 b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx);
643 ip.Y = Round(ip.X / Edge2.Dx + b2);
644 }
645 }
646 else if (Edge2.Dx == 0)
647 {
648 ip.X = Edge2.Bot.X;
649 if (IsHorizontal(Edge1))
650 ip.Y = Edge1.Bot.Y;
651 else
652 {
653 b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx);
654 ip.Y = Round(ip.X / Edge1.Dx + b1);
655 }
656 }
657 else
658 {
659 b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx;
660 b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx;
661 double q = (b2-b1) / (Edge1.Dx - Edge2.Dx);
662 ip.Y = Round(q);
663 if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx))
664 ip.X = Round(Edge1.Dx * q + b1);
665 else
666 ip.X = Round(Edge2.Dx * q + b2);
667 }
668
669 if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y)
670 {
671 if (Edge1.Top.Y > Edge2.Top.Y)
672 ip.Y = Edge1.Top.Y;
673 else
674 ip.Y = Edge2.Top.Y;
675 if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx))
676 ip.X = TopX(Edge1, ip.Y);
677 else
678 ip.X = TopX(Edge2, ip.Y);
679 }

Callers 1

BuildIntersectListMethod · 0.85

Calls 3

TopXFunction · 0.85
IsHorizontalFunction · 0.85
RoundFunction · 0.85

Tested by

no test coverage detected