| 646 | //------------------------------------------------------------------------------ |
| 647 | |
| 648 | void IntersectPoint(TEdge& Edge1, TEdge& Edge2, IntPoint& ip) |
| 649 | { |
| 650 | #ifdef use_xyz |
| 651 | ip.Z = 0; |
| 652 | #endif |
| 653 | |
| 654 | double b1, b2; |
| 655 | if (Edge1.Dx == Edge2.Dx) { |
| 656 | ip.Y = Edge1.Curr.Y; |
| 657 | ip.X = TopX(Edge1, ip.Y); |
| 658 | return; |
| 659 | } else if (Edge1.Dx == 0) { |
| 660 | ip.X = Edge1.Bot.X; |
| 661 | if (IsHorizontal(Edge2)) |
| 662 | ip.Y = Edge2.Bot.Y; |
| 663 | else { |
| 664 | b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx); |
| 665 | ip.Y = Round(ip.X / Edge2.Dx + b2); |
| 666 | } |
| 667 | } else if (Edge2.Dx == 0) { |
| 668 | ip.X = Edge2.Bot.X; |
| 669 | if (IsHorizontal(Edge1)) |
| 670 | ip.Y = Edge1.Bot.Y; |
| 671 | else { |
| 672 | b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx); |
| 673 | ip.Y = Round(ip.X / Edge1.Dx + b1); |
| 674 | } |
| 675 | } else { |
| 676 | b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx; |
| 677 | b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx; |
| 678 | double q = (b2 - b1) / (Edge1.Dx - Edge2.Dx); |
| 679 | ip.Y = Round(q); |
| 680 | if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) |
| 681 | ip.X = Round(Edge1.Dx * q + b1); |
| 682 | else |
| 683 | ip.X = Round(Edge2.Dx * q + b2); |
| 684 | } |
| 685 | |
| 686 | if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y) { |
| 687 | if (Edge1.Top.Y > Edge2.Top.Y) |
| 688 | ip.Y = Edge1.Top.Y; |
| 689 | else |
| 690 | ip.Y = Edge2.Top.Y; |
| 691 | if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) |
| 692 | ip.X = TopX(Edge1, ip.Y); |
| 693 | else |
| 694 | ip.X = TopX(Edge2, ip.Y); |
| 695 | } |
| 696 | //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ... |
| 697 | if (ip.Y > Edge1.Curr.Y) { |
| 698 | ip.Y = Edge1.Curr.Y; |
| 699 | //use the more vertical edge to derive X ... |
| 700 | if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx)) |
| 701 | ip.X = TopX(Edge2, ip.Y); |
| 702 | else |
| 703 | ip.X = TopX(Edge1, ip.Y); |
| 704 | } |
| 705 | } |
no test coverage detected