[C] Równanie płaszczyzny... a współliniowość

gblablabla
Użytkownik
Użytkownik
Posty: 420
Rejestracja: 6 lis 2010, o 20:10
Płeć: Mężczyzna
Lokalizacja: Clausthal-Zellerfeld
Podziękował: 65 razy
Pomógł: 25 razy

[C] Równanie płaszczyzny... a współliniowość

Post autor: gblablabla »

Witam. Napisałem program, który znajduje poprzez obliczenie wyznacznika odpowiedniej macierzy i przyrównanie go do zera (wydaje mi się, że poprawnie - proszę o testy) płaszczyznę, do której należą trzy punkty bądź wskazuje jeden punkt (gdy wszystkie trzy punkty są takie same). Natomiast w przypadku prostej niezawsze program wypisuje poprawnie tę prostą - zaznaczyłem w kodzie komentarzem, gdzie jest problem - jak to poprawić?
Pozdrawiam

Kod: Zaznacz cały

#include<stdio.h>  //printf, scanf
#include<conio.h> //getch
#include<math.h> //sqrt

int main ()
{ int ax, ay, az, bx, by, bz, cx, cy, cz, A, B, C, D;
  printf("Podaj wspolrzedne punktu A: 
");
  printf("Wspolrzedna x: ");
  scanf("%d", &ax);
  printf("Wspolrzedna y: ");
  scanf("%d", &ay);
  printf("Wspolrzedna z: ");
  scanf("%d", &az);
  printf("Podaj wspolrzedne punktu B: 
");
  printf("Wspolrzedna x: ");
  scanf("%d", &bx);
  printf("Wspolrzedna y: ");
  scanf("%d", &by);
  printf("Wspolrzedna z: ");
  scanf("%d", &bz);
  printf("Podaj wspolrzedne punktu C: 
");
  printf("Wspolrzedna x: ");
  scanf("%d", &cx);
  printf("Wspolrzedna y: ");
  scanf("%d", &cy);
  printf("Wspolrzedna z: ");
  scanf("%d", &cz);
  A = by*cz - by*az - ay*cz + ay*az - bz*cy + bz*ay + az*cy - az*ay;
  B = cx*bz - cx*az - ax*bz + ax*az - cz*bx + cz*ax + az*bx - az*ax;
  C = bx*cy - bx*ay - ax*cy + ax*ay - by*cx + by*ax + ay*cx - ay*ax;
  D = - ax*by*cz + ax*ay*cz + ax*by*az
      - bx*cy*az + ax*cy*az + bx*ay*az
      - cx*ay*bz + ax*ay*bz + cx*ay*az
      + az*by*cx - az*ay*cx - az*by*ax
      + bz*cy*ax - az*cy*ax - bz*ay*ax
      + cz*ay*bx - az*ay*bx - cz*ay*ax;
  if (A*A > 0 && B*B > 0 && C*C > 0)
  { printf("Plaszczyzna o rownaniu ogolnym: 
%dx + %dy + %dz + %d = 0", A, B, C, D);
    getch();
    return 0;
  }
  else
  { if (ax != bx | bx != cx | ay != by | by != cy | az != bz | bz != cz)
    { if (A == B && B == C && C == D && D == 0)
      { printf("Punkty te tworza prosta."); //niezawsze 0x + 0y + 0z + 0 = 0...
        getch();
        return 0;
      }
      else
      { printf("Punkty te tworza prosta o rownaniu: 
%dx + %dy + %dz + %d = 0", A, B, C, D);
        getch();
        return 0; 
      }  
    }
    else
    { printf("Podales punkt: 
A = (%d, %d, %d)", ax, ay, az);
       getch();
       return 0;
    }
  } 
  return 0;
}
-- 11 mar 2012, o 18:30 --

Matematycznie chodzi tu o równanie prostej, kiedy wyznacznik:
\(\displaystyle{ \left|\begin{array}{ccc}x - ax&y - ay&z - az\\bx - ax&by - ay&bz - az\\cx - ax&cy - ay&cz -az\end{array}\right|}\)
niezależnie od parametrów przy \(\displaystyle{ x, y, z}\) i tak jest zerem, zatem w sytuacji, gdy:
\(\displaystyle{ (bx - ax, by - ay, bz - az) = k (cx - ax, cy - ay, cz -az), k \in \mathbb{R}}\).
Również dla przypadku:
\(\displaystyle{ (x - ax, bx - ax, cx - ax) \in lin((y - ay, by - ay, cy - ay),(z - az, bz - az, cz - az))}\).
oraz:
\(\displaystyle{ (y - ay, by - ay, cy - ay) = t(z - az, bz - az, cz - az), t \in \mathbb{R}}\).

Myślę ewentualnie nad równaniem prostej wyznaczanej przez dwa punkty w \(\displaystyle{ \mathbb{R}^3}\), ale nie znalazłem wzoru.
Pozdrawiam.
szw1710

[C] Równanie płaszczyzny... a współliniowość

Post autor: szw1710 »

Nie sądzę, aby wyznacznik był najlepszym sposobem programistycznym. Znacznie łatwiej zbudować trzy wektory, wyznaczyć ich iloczyn wektorowy i napisać równanie. Wyznacznik jest bardzo nieekonomiczny w liczeniu. Oczywiście traci to na znaczeniu przy obecnych komputerach.
gblablabla
Użytkownik
Użytkownik
Posty: 420
Rejestracja: 6 lis 2010, o 20:10
Płeć: Mężczyzna
Lokalizacja: Clausthal-Zellerfeld
Podziękował: 65 razy
Pomógł: 25 razy

[C] Równanie płaszczyzny... a współliniowość

Post autor: gblablabla »

W jaki sposób? Dla trzech punktów. Prosiłbym uprzejmie o odpowiednie wzory + algorytm słownie, a na kod przepiszę.
Trzy współliniowe punkty nie tworzą prostej, lecz płaszczyznę - mój błąd.

Pozdrawiam
szw1710

[C] Równanie płaszczyzny... a współliniowość

Post autor: szw1710 »

Co do prostej - najlepiej równanie w postaci parametrycznej po wykryciu współliniowości punktów. Robimy to z odległości punktów. Liczysz je i porządkujesz je od najmniejszej do największej. Jeśli dwie mniejsze dają razem największą, to punkty są współliniowe. Równanie prostej zapiszesz w postaci

\(\displaystyle{ x=x_A+(x_B-x_A)t,\quad y=y_A+(y_B-y_A)t,\quad z=z_A+(z_B-z_A)t,\quad t\in\mathbb{R}.}\)
gblablabla
Użytkownik
Użytkownik
Posty: 420
Rejestracja: 6 lis 2010, o 20:10
Płeć: Mężczyzna
Lokalizacja: Clausthal-Zellerfeld
Podziękował: 65 razy
Pomógł: 25 razy

[C] Równanie płaszczyzny... a współliniowość

Post autor: gblablabla »

Problem w tym, że to jest \(\displaystyle{ \mathbb{R}^3}\)...
Jak wektory współrzędnych jedynie dwóch punktów będą tworzyły układ liniowo zależny - to problem z głowy - przemianuję zmienne.

Gorzej jak będzie wejście np.:
1
1
1
2
2
2
10
10
10
...wtedy nie mogę przemianować zmiennych a wyzn. zawsze będzie zerem.
szw1710

[C] Równanie płaszczyzny... a współliniowość

Post autor: szw1710 »

W prostej właśnie o to chodzi, aby tworzyły układ liniowo zależny. Ale liniową zależność/niezależność też sprawdzisz na odległościach. Trzy punkty \(\displaystyle{ A,B,C}\) są współliniowe wtedy i tylko wtedy, gdy \(\displaystyle{ |AC|=|AB|+|BC|}\) (z założeniem, że najdłuższa jest odległość \(\displaystyle{ |AC|}\)). Trzy punkty czynią sprawę dwuwymiarową. Rzecz odbywa się co najwyżej na płaszczyźnie.
gblablabla
Użytkownik
Użytkownik
Posty: 420
Rejestracja: 6 lis 2010, o 20:10
Płeć: Mężczyzna
Lokalizacja: Clausthal-Zellerfeld
Podziękował: 65 razy
Pomógł: 25 razy

[C] Równanie płaszczyzny... a współliniowość

Post autor: gblablabla »

Hmmm no ale co potem, jak już uznam, że każdy z trzech wektorów da się wygenerować za pomocą pozostałych? Nie rozumiem jak.
ODPOWIEDZ