Find if a point is within a triangle: Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 2,097: | Line 2,097: | ||
Triangle is [[0.1, 0.1111111111111111], [12.5, 33.333333333333336], [-12.5, 16.666666666666668]] |
Triangle is [[0.1, 0.1111111111111111], [12.5, 33.333333333333336], [-12.5, 16.666666666666668]] |
||
Point [5.414285714285714, 14.349206349206348] is within triangle? true</pre> |
Point [5.414285714285714, 14.349206349206348] is within triangle? true</pre> |
||
=={{header|Vlang}}== |
|||
{{trans|go}} |
|||
<lang vlang>import math |
|||
const eps = 0.001 |
|||
const eps_square = eps * eps |
|||
fn side(x1 f64, y1 f64, x2 f64, y2 f64, x f64, y f64) f64 { |
|||
return (y2-y1)*(x-x1) + (-x2+x1)*(y-y1) |
|||
} |
|||
fn native_point_in_triangle(x1 f64, y1 f64, x2 f64, y2 f64, x3 f64, y3 f64, x f64, y f64) bool { |
|||
check_side1 := side(x1, y1, x2, y2, x, y) >= 0 |
|||
check_side2 := side(x2, y2, x3, y3, x, y) >= 0 |
|||
check_side3 := side(x3, y3, x1, y1, x, y) >= 0 |
|||
return check_side1 && check_side2 && check_side3 |
|||
} |
|||
fn point_in_triangle_bounding_box(x1 f64, y1 f64, x2 f64, y2 f64, x3 f64, y3 f64, x f64, y f64) bool { |
|||
x_min := math.min(x1, math.min(x2, x3)) - eps |
|||
x_max := math.max(x1, math.max(x2, x3)) + eps |
|||
y_min := math.min(y1, math.min(y2, y3)) - eps |
|||
y_max := math.max(y1, math.max(y2, y3)) + eps |
|||
return !(x < x_min || x_max < x || y < y_min || y_max < y) |
|||
} |
|||
fn distance_square_point_to_segment(x1 f64, y1 f64, x2 f64, y2 f64, x f64, y f64) f64 { |
|||
pq_p2_square_length := (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) |
|||
dot_product := ((x-x1)*(x2-x1) + (y-y1)*(y2-y1)) / pq_p2_square_length |
|||
if dot_product < 0 { |
|||
return (x-x1)*(x-x1) + (y-y1)*(y-y1) |
|||
} else if dot_product <= 1 { |
|||
p_p1_square_length := (x1-x)*(x1-x) + (y1-y)*(y1-y) |
|||
return p_p1_square_length - dot_product*dot_product*pq_p2_square_length |
|||
} else { |
|||
return (x-x2)*(x-x2) + (y-y2)*(y-y2) |
|||
} |
|||
} |
|||
fn accurate_point_in_triangle(x1 f64, y1 f64, x2 f64, y2 f64, x3 f64, y3 f64, x f64, y f64) bool { |
|||
if !point_in_triangle_bounding_box(x1, y1, x2, y2, x3, y3, x, y) { |
|||
return false |
|||
} |
|||
if native_point_in_triangle(x1, y1, x2, y2, x3, y3, x, y) { |
|||
return true |
|||
} |
|||
if distance_square_point_to_segment(x1, y1, x2, y2, x, y) <= eps_square { |
|||
return true |
|||
} |
|||
if distance_square_point_to_segment(x2, y2, x3, y3, x, y) <= eps_square { |
|||
return true |
|||
} |
|||
if distance_square_point_to_segment(x3, y3, x1, y1, x, y) <= eps_square { |
|||
return true |
|||
} |
|||
return false |
|||
} |
|||
fn main() { |
|||
pts := [[f64(0), 0], [f64(0), 1], [f64(3), 1]] |
|||
mut tri := [[3.0 / 2, 12.0 / 5], [51.0 / 10, -31.0 / 10], [-19.0 / 5, 1.2]] |
|||
println("Triangle is $tri") |
|||
mut x1, mut y1 := tri[0][0], tri[0][1] |
|||
mut x2, mut y2 := tri[1][0], tri[1][1] |
|||
mut x3, mut y3 := tri[2][0], tri[2][1] |
|||
for pt in pts { |
|||
x, y := pt[0], pt[1] |
|||
within := accurate_point_in_triangle(x1, y1, x2, y2, x3, y3, x, y) |
|||
println("Point $pt is within triangle? $within") |
|||
} |
|||
println('') |
|||
tri = [[1.0 / 10, 1.0 / 9], [100.0 / 8, 100.0 / 3], [100.0 / 4, 100.0 / 9]] |
|||
println("Triangle is $tri") |
|||
x1, y1 = tri[0][0], tri[0][1] |
|||
x2, y2 = tri[1][0], tri[1][1] |
|||
x3, y3 = tri[2][0], tri[2][1] |
|||
x := x1 + (3.0/7)*(x2-x1) |
|||
y := y1 + (3.0/7)*(y2-y1) |
|||
pt := [x, y] |
|||
mut within := accurate_point_in_triangle(x1, y1, x2, y2, x3, y3, x, y) |
|||
println("Point $pt is within triangle ? $within") |
|||
println('') |
|||
tri = [[1.0 / 10, 1.0 / 9], [100.0 / 8, 100.0 / 3], [-100.0 / 8, 100.0 / 6]] |
|||
println("Triangle is $tri") |
|||
x3 = tri[2][0] |
|||
y3 = tri[2][1] |
|||
within = accurate_point_in_triangle(x1, y1, x2, y2, x3, y3, x, y) |
|||
println("Point $pt is within triangle ? $within") |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
Triangle is [[1.5, 2.4], [5.1, -3.1], [-3.8, 1.2]] |
|||
Point [0, 0] is within triangle? true |
|||
Point [0, 1] is within triangle? true |
|||
Point [3, 1] is within triangle? false |
|||
Triangle is [[0.1, 0.1111111111111111], [12.5, 33.333333333333336], [25, 11.11111111111111]] |
|||
Point [5.414285714285714, 14.349206349206348] is within triangle ? true |
|||
Triangle is [[0.1, 0.1111111111111111], [12.5, 33.333333333333336], [-12.5, 16.666666666666668]] |
|||
Point [5.414285714285714, 14.349206349206348] is within triangle ? true |
|||
</pre> |
|||
=={{header|Wren}}== |
=={{header|Wren}}== |