1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

Điều kiện để 1 điểm nằm trong tam giác

Chủ đề trong 'Toán học' bởi Kidgunner, 12/06/2005.

  1. 1 người đang xem box này (Thành viên: 0, Khách: 1)
  1. Kidgunner

    Kidgunner Thành viên quen thuộc

    Tham gia ngày:
    09/04/2002
    Bài viết:
    372
    Đã được thích:
    0
    Điều kiện để 1 điểm nằm trong tam giác

    Tớ phải viết 1 chương trình Java, trong đó điều kiện đưa vào là 1điểm toạ độ (x,y) phải nằm trong 1 tam giác có 3 đỉnh cho trước A(Xa,Ya); B(Xb,Yb), C(Xc,Yc); cái này quả thật tớ học qua lâu quá rồi ko còn nhớ nữa, vậy mong có bạn nào giúp đỡ, cám ơn rất nhiều.
  2. Ironie

    Ironie Thành viên mới

    Tham gia ngày:
    03/03/2005
    Bài viết:
    25
    Đã được thích:
    0
    Một điểm M nằm trong 1 tam giác ABC với điều kiện là định thức của các cặp vectơ (AM,AC),(BM,BA),(CM,CB) cùng dấu.
    Để phòng trường hợp bạn không nhớ nốt, tớ định nghĩa luôn vectơ nối 2 điểm và định thức củ hai vectơ:
    _ vectơ nối hai điểm A,B là : AB=(Xb-Xa,Yb-Ya)
    _ định thức của hai vectơ U,V là : det(U,V)= Xu*Yv - Xv*Yu
  3. Kidgunner

    Kidgunner Thành viên quen thuộc

    Tham gia ngày:
    09/04/2002
    Bài viết:
    372
    Đã được thích:
    0
    Cám ơn bạn rất rất nhiều, ko có gì ngoài 5*, chúc bạn thành công!
  4. I_am_joking

    I_am_joking Thành viên mới

    Tham gia ngày:
    24/06/2004
    Bài viết:
    581
    Đã được thích:
    1
    Có một thuật toán chung để xét xem 1 điểm có nằm trong 1 đa giác đơn (đa giác không tự cắt chính nó) hay không là từ điểm đó phóng ra 1 tia. Nếu tia này cắt 1 số lẻ cạnh của đa giác thì điểm kia nằm trong đa giác, số chẵn cạnh thì nó nằm bên ngoài đa giác. Tất nhiên phải xét đến những trường hợp đặc biệt khi mà tia phóng ra cắt các cạnh tại đỉnh.
  5. Ironie

    Ironie Thành viên mới

    Tham gia ngày:
    03/03/2005
    Bài viết:
    25
    Đã được thích:
    0
    Trong trường hợp là đa giác bất kì không tự cắt thì phải dùng đến cách của bạn, nhưng đây là trường hợp đa giác lồi thì không cần phải dùng đến cách đó, cách của mình trong trường hợp đa giác lồi dễ viết chương trình hơn.
  6. be_te

    be_te Thành viên mới

    Tham gia ngày:
    27/05/2004
    Bài viết:
    155
    Đã được thích:
    1
    Thân gửi Ironie:
    "cách của mình trong trường hợp đa giác lồi ....."
    => xin thắc mắc 1 chút: làm sao mở rộng cách làm của bạn cho đa giác lồi bất kỳ ? Có phảI là đi 1 vòng theo chu vi, lấy 2 cạnh liên tiếp => định thức sẽ không đổi dấu !? Nếu vậy thì đúng là dễ lập trình thiệt
    Tui rất thích cách giải này cho tam giác (và đa giác lồi) vì rất đơn giản
    Còn cách của I_am_joking đề cập thì lại được xài trong thực tế hơn vì áp dụng được cho cả đa giác lõm
    Tui xin thử nói sơ cho vui 1 cách mà tui nghĩ là áp dụng được cho đa giác bất kỳ (lồi, lõm, tự cắt):
    Đi vòng theo chu vi, lấy 2 cạnh liên tiếp => tính góc đại số (có dấu) giữa 2 cạnh này => cộng dồn lại. Nếu điểm nằm trong đa giác thì tổng đại số (có dấu) của các góc đại số này sẽ là bội số của 360 độ; nếu điểm nằm ngoài thì tổng đại số sẽ là 0 (điểm nằm trên1cạnh/đỉnh sẽ là trường hợp riêng). Góc đại số là góc có dấu (giả sử qui ước: thuận chiều kim đồng hồ là dương, nghịch là âm)
    bạn nào siêng thì xin kiểm chứng giùm (tui đã thử với hình ngôi sao 5 cánh)
    (có gì sai sót xin các bạn chỉ giúp, cám ơn rất nhiều)
    -thân
  7. Ironie

    Ironie Thành viên mới

    Tham gia ngày:
    03/03/2005
    Bài viết:
    25
    Đã được thích:
    0
    Uh, chỉ việc đi theo các cạnh rùi tính định thức thôi, rất đơn giản và dễ lập trình , cách dùng tia cũng rất hay nhưng vì phải tính thêm các trường hợp tia cắt các cạnh tại đỉnh nên độ phức tạp cao hơn một tí.
    Tớ nghĩ là cách của bạn đúng, có phải là bạn tính góc đại số nhìn từ điểm đang xét tới các cạnh của đa giác không? Mình có thể tính giá trị của các góc này bằng hàm arcsin, cách này hay nhưng phải tính toán hơi nhiều (phải tính ra sin các góc rùi dùng hàm arcsin để tính ra các giá trị).
  8. hoangvhung_sp

    hoangvhung_sp Thành viên mới

    Tham gia ngày:
    31/12/2004
    Bài viết:
    53
    Đã được thích:
    10
    <script language="JavaScript"><!--
    function calc() {
    if (fAB()*fBC()>0 && fBC()*fCA()>0) {
    document.form1.out.value = "Inside"}
    else {
    document.form1.out.value = "Not Inside"}
    }
    function fAB() {
    return (eval((document.form1.y.value-document.form1.y1.value)*
    (document.form1.x2.value-document.form1.x1.value) -
    (document.form1.x.value-document.form1.x1.value)*
    (document.form1.y2.value-document.form1.y1.value)))
    }
    function fBC() {
    return (eval((document.form1.y.value-document.form1.y2.value)*
    (document.form1.x3.value-document.form1.x2.value) -
    (document.form1.x.value-document.form1.x2.value)*
    (document.form1.y3.value-document.form1.y2.value)))
    }
    function fCA() {
    return (eval((document.form1.y.value-document.form1.y3.value)*
    (document.form1.x1.value-document.form1.x3.value) -
    (document.form1.x.value-document.form1.x3.value)*
    (document.form1.y1.value-document.form1.y3.value)))
    }
    // --></script>
  9. hoangvhung_sp

    hoangvhung_sp Thành viên mới

    Tham gia ngày:
    31/12/2004
    Bài viết:
    53
    Đã được thích:
    10
    Thuật toán tham khảo thêm tại đây :
    http://mcraefamily.com/MathHelp/GeometryPointAndTriangle2.htm
  10. Kidgunner

    Kidgunner Thành viên quen thuộc

    Tham gia ngày:
    09/04/2002
    Bài viết:
    372
    Đã được thích:
    0
    Cũng đuợc nhưng hình như cái cách làm này hơi dài thì phải, tớ đã viết đoạn Code Java theo cách của bạn Ironie và nó đơn giản hơn nhiều:
    boolean ok= true;
    do
    {
    (.....)
    double det1 = (startPunkt[ 0] - eckePunktX[ 0]) * (eckePunktY[ 2] - eckePunktY[ 0]) - (eckePunktX[ 2] - eckePunktX[ 0]) * (startPunkt[ 1] - eckePunktY[ 0]);
    double det2 = (startPunkt[ 0] - eckePunktX[ 1]) * (eckePunktY[ 0] - eckePunktY[ 1]) - (eckePunktX[ 0] - eckePunktX[ 1]) * (startPunkt[ 1] - eckePunktY[ 1]);
    double det3 = (startPunkt[ 0] - eckePunktX[ 2]) * (eckePunktY[ 1] - eckePunktY[ 2]) - (eckePunktX[ 1] - eckePunktX[ 2]) * (startPunkt[ 1] - eckePunktY[ 2]);
    if ( det1 >= 0 && det2 >= 0 && det3 >= 0 ) ok=true;
    else if ( det1 < 0 && det2 <0 && det3 < 0 ) ok=true;
    else {
    System.out.println(" StartPunkt ist nicht in der Dreieck, geben Sie noch mal ein! "); //điểm ko nằm trong tam giác
    ok=false;

    }
    }
    while (ok==false);
    Tớ dùng tiếng Đức nhưng nói chung là tớ gán 3 toạ độ x và 3 toạ độ y vào 2 mảng eckePunkt. (...) là nhập toạ độ các điểm.
    1 lần nữa cảm ơn bạn Ironie.

Chia sẻ trang này