1 Востаннє редагувалося Yola (09.10.2013 20:14:11)

Тема: Як визначити, що два трикутники мають однакові вершини, але нормалі ..

Припустимо два трикутники з індексами вершин

1,2,3
3,2,1

Як мені швидко порівняти два трикутники, що вони мають ті самі вершини, але дивляться в різні боки?

І як це зробити швидко *SCRATCH*

РЕДАГОВАНО:
дивляться в різні боки означає, що в другого вершини йдуть в іншому порядку ніж у першого.

2

Re: Як визначити, що два трикутники мають однакові вершини, але нормалі ..

Yola написав:

Припустимо два трикутники з індексами вершин

1,2,3
3,2,1

Як мені швидко порівняти два трикутники, що вони мають ті самі вершини, але дивляться в різні боки?

посортувати вершини і порівняти, ні?

Подякували: koala1

3 Востаннє редагувалося mike (09.10.2013 20:31:02)

Re: Як визначити, що два трикутники мають однакові вершини, але нормалі ..

Yola написав:

РЕДАГОВАНО:
дивляться в різні боки означає, що в другого вершини йдуть в іншому порядку ніж у першого.

ну в чому проблема, якщо в трикутників вершини однакові і від їх сортування, нічого не зміниться, це те саме, що просто перекрутити іншим боком.
UPD
а ні, ступив, якщо буде 3,1,2, то тоді не канає
UPD 2
ще одне, якщо буде 3,1,2 і 3,2,1 - то тоді получається вони різні трикутники, в яких зовсім різні кути.

4 Востаннє редагувалося Ярослав (09.10.2013 20:50:00)

Re: Як визначити, що два трикутники мають однакові вершини, але нормалі ..

Якщо передбачається такий спосіб розташування трикутників, як в докладеному зображенні, то можна зробити так:
1. Створити масив для вершин, оскільки ми знаємо, що вершин завжди буде три і трикутника два то масив буде мати розмір [5].
2. Створити змінну, яка прийме своїм значенням кількість співпадінь вершин.
3. Створити цикл і необхідні для нього змінні.
Першим кроком користувач задає вершини для першого і другого трикутника, треба передбачити можливі помилки вводу: однакові цифри, нуль, від'ємні значення.
Напр. 1 4 5\n5 8 9 (червоний та зелений)
або
1 4 5\n2 3 6 (червоний та синій)
В першому випадку трикутник задовольняє умові задачі, в другому ні.
Наступним кроком створити цикл:

for(i=0, flag=0; i < 3: i++){
   if(arr[i] == arr[3] || arr[i] == arr[4] || arr[i] == arr[5])
      flag++;
}

А потім оператор switch:
1 збіг - трикутники дивляться в різні сторони і мають спільні вершини;
2 збіги - трикутники мають спільну сторону;
3 збіги - трикутники однакові;
нема збігів - трикутники не мають спільних точок.

Post's attachments

trykutnyky.png 1.8 kb, 295 downloads since 2013-10-09 

5

Re: Як визначити, що два трикутники мають однакові вершини, але нормалі ..

2Ярослав,
Який результат ваш алгоритм видасть на трикутниках 1,2,3 - 3,2,1 - вони мають спільні вершини, але дивляться в різні боки.


Ярослав написав:

Першим кроком користувач задає вершини для першого і другого трикутника, треба передбачити можливі помилки вводу: однакові цифри, нуль, від'ємні значення.

це зайве.

6

Re: Як визначити, що два трикутники мають однакові вершини, але нормалі ..

#include <stdio.h>

#define S 3

void comp(int *a1, int *a2)
{
    if (!a1 || !a2) {printf("Invalid arrays passed.\n"); return;}
    
    int i, j, flag=0;
    
    for( i = 0; i < S && a2[i] != a1[0]; i++); /* Looking for the first item from a1 in a2 */
    
    if( i < S ) /* Item found: sequences could be similar */
        for( j = 0, flag=1; j < S; j++, i++, i%= S)
            if( a1[j] != a2[i] ) { flag = 0; break; }
    
    printf("Triangles are %s\n", flag? "similar": "different");
}

int main(int argc, char *argv[])
{    
    int tr_1[s] = {1,2,3}, /* First ok */
        tr_2[s] = {3,1,2}, /* Second ok */
        tr_3[s] = {1,3,2}; /* Wrong  one*/
    
    comp(tr_1, tr_2); /* Similar */
    comp(tr_1, tr_3); /* Different */
    comp(tr_2, tr_3); /* Different */

    return 0;
}

http://osidok.pp.ua/images/2013/10/10/test.png

7

Re: Як визначити, що два трикутники мають однакові вершини, але нормалі ..

2Bartash,

дякую за спробу, та мені треба щоб на двох трикутниках зі спільними вершинами і різним порядком нумерації щодо годинникової стрілки - за і проти, видавало "істина", на всіх інших "брехня".

8

Re: Як визначити, що два трикутники мають однакові вершини, але нормалі ..

Yola написав:

2Bartash,

дякую за спробу, та мені треба щоб на двох трикутниках зі спільними вершинами і різним порядком нумерації щодо годинникової стрілки - за і проти, видавало "істина", на всіх інших "брехня".

Зараз вас не зрозумів.

З першого положення нижче друге і третє вийдуть незалежно від напряму обертання (просто у різній послідовності).

   2                 1                  3
1    3           3     2            2    1

Що у даному разі некоректно або відсутнє?

9 Востаннє редагувалося Yola (12.10.2013 15:35:26)

Re: Як визначити, що два трикутники мають однакові вершини, але нормалі ..

Bartash написав:

З першого положення нижче друге і третє вийдуть незалежно від напряму обертання (просто у різній послідовності).

   2                 1                  3
1    3           3     2            2    1

Що у даному разі некоректно або відсутнє?

Дивіться, у трикутників з різними порядками вершин за/проти годинниковою стрілкою, нормалі спрямовані в різні боки. Це використовується в 3 вимірній графіці.

Ви можете переконатись через використання векторного добутку, згадайте правило правої руки, або ж гвинта як визначати напрямок добутку векторів.

Маємо два трикутники:

1   2   1   3
   3       2

Давайте знайдемо нормалі.

Нормаль - це прямовис до площини трикутника. отже нормаль є Normalize((Cross(12, 13))

Для наведених трикутників вони спрямовані в протилежні боки.

Post's attachments

Right_hand_rule_cross_product.svg 7.96 kb, 544 downloads since 2013-10-12