Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct LineSegment {
- vec2 min;
- vec2 max;
- }
- struct Rectangle {
- vec2 min;
- vec2 max;
- };
- LineSegment clipLineSegmentToRectangle(LineSegment lineSegment, Rectangle rectangle) {
- if lineSegment.min.x < rectangle.min.x {
- if rectangle.min.x < lineSegment.max.x {
- lineSegment.min = intersectLineSegmentWithHorizontalLine(lineSegment, rectangle.min.x);
- } else {
- lineSegment.min.x = rectangle.min.x;
- lineSegment.max.x = rectangle.min.x;
- }
- }
- if rectangle.x.max < lineSegment.max.x {
- if lineSegment.min.x < rectangle.min.x {
- lineSegment.min = intersectLineSegmentWithHorizontalLine(lineSegment, rectangle.max.x);
- } else {
- lineSegment.min.x = rectangle.max.x;
- lineSegment.max.x = rectangle.max.x;
- }
- }
- if lineSegment.min.y < rectangle.min.y {
- if rectangle.min.y < lineSegment.max.y {
- lineSegment.min = intersectLineSegmentWithVerticalLine(lineSegment, rectangle.min.y);
- } else {
- lineSegment.min.y = rectangle.min.y;
- lineSegment.max.y = rectangle.min.y;
- }
- }
- if rectangle.max.y < lineSegment.max.y {
- if lineSegment.min.y < rectangle.max.y {
- lineSegment.max = intersectLineSegmentWithVerticalLine(lineSegment, rectangle.max.y);
- } else {
- lineSegment.min.y = rectangle.max.y;
- lineSegment.max.y = rectangle.max.y;
- }
- }
- return lineSegment;
- }
- vec2 intersectLineSegmentWithHorizontalLine(LineSegment lineSegment, horizontalLineX: float) {
- return vec2(
- horizontalLineX,
- mix(
- lineSegment.min.y,
- lineSegment.max.y,
- (horizontalLineX - lineSegment.min.x) / (lineSegment.max.x - lineSegment.min.x)
- )
- )
- }
- vec2 intersectLineSegmentWithVerticalLine(LineSegment lineSegment, verticalLineY: float) {
- return vec2(
- mix(
- lineSegment.min.x,
- lineSegment.max.x,
- (verticalLineY - lineSegment.min.y) / (lineSegment.max.y - lineSegment.min.y)
- ),
- verticalLineY
- );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement