| 620 | //------------------------------------------------------------------------------ |
| 621 | |
| 622 | void 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 | } |
no test coverage detected