javascript - Bagaimana untuk menentukan sama ada titik berada dalam segitiga dalam js?
巴扎黑
巴扎黑 2017-06-12 09:29:32
0
3
1394

Apakah formula matematik yang digunakan?

巴扎黑
巴扎黑

membalas semua(3)
滿天的星座

Soalan yang sangat biasa dalam geometri pengiraan

Ada △ABC,以及点O(x, y), biarkan koordinat bucu segi tiga ialah: A(x1,y1), B(x2,y2), C(x3,y3)

Titik O berada dalam △ABC, dan titik O dan titik C berada pada sisi yang sama bagi garis lurus AB, kemudian:

[(x-x1)(y2-y1) - (y-y1)(x2-x1)][(x3-x1)(y2-y1) - (y3-y1)(x2-x1)] > 0

Begitu juga, titik O dan titik B berada pada sisi yang sama bagi garis lurus AC;

Jika tiga syarat di atas dipenuhi, titik O berada dalam △ABC.


Secara peribadi, saya lebih suka kaedah ini kerana ia hanya mengandungi empat operasi aritmetik dan pertimbangan saiz, dan tidak melibatkan operasi seperti fungsi trigonometri dan punca kuasa dua, jadi ia lebih pantas. Jika ada cara yang lebih baik, sila beri nasihat.

phpcn_u1582

Boleh diproses melalui sistem koordinat Barycentric.
Pautan rujukan: https://en.wikipedia.org/wiki...

Andaikan titik yang akan diuji ialah (x0, y0), dan tiga titik segitiga ialah (x1, y1), (x2, y2), (x3, y3)

Mengikut takrifan koordinat pusat graviti:

x0 = a * x1 + b * x2  + c * x3
y0 = a * y1 + b * y2 + c * y3
a + b + c = 1

di mana a b c ialah tiga pekali masing-masing. Jika dan hanya jika a b c kedua-duanya lebih besar daripada atau sama dengan 0 dan kurang daripada atau sama dengan 1, titik (x0, y0) berada dalam segi tiga yang dibentuk oleh titik (x1, y1), titik (x2, y2) dan titik ( x3, y3).

Dari definisi di atas, kita boleh mendapatkan penyelesaian a b c:

a = ((y2 - y3)*(x0 - x3) + (x3 - x2)*(y0 - y3)) / ((y2 - y3)*(x1 - x3) + (x3 - x2)*(y1 - y3))
b = ((y3 - y1)*(x0 - x3) + (x1 - x3)*(y0 - y3)) / ((y2 - y3)*(x1 - x3) + (x3 - x2)*(y1 - y3))
c = 1 - a - b

Ditulis dalam kaedah JS:

function pointInTriangle(x0, y0, x1, y1, x2, y2, x3, y3) {
  var pisor = (y2 - y3)*(x1 - x3) + (x3 - x2)*(y1 - y3);
  var a = ((y2 - y3)*(x0 - x3) + (x3 - x2)*(y0 - y3)) / pisor;
  var b = ((y3 - y1)*(x0 - x3) + (x1 - x3)*(y0 - y3)) / pisor;
  var c = 1 - a - b;

  return a >= 0 && a <= 1 && b >= 0 && b <= 1 && c >= 0 && c <= 1
}
漂亮男人

Ini bukan mudah
Sebagai contoh, titik x mempunyai tiga sudut a, b, dan c segitiga
x ialah bucu sudut Jika hasil tambah bagi tiga sudut
axb bxc cxa ialah 360 darjah, maka titik x. berada dalam segi tiga

Terdapat banyak artikel
Cari mereka
http://www.cnblogs.com/baie/a...

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan