Program liczący pole powierzchni nakładających się trójkątów

0

Witam. Czy jest ktoś w stanie pomóc z tym programem, gdyż za 2 godziny mam z tego zaliczenie a nic nie czaję. Jak się do tego zabrać, w jaki sposób rozwiązać to zadanie i jak policzyć to pole?

Napisać program, który:

  • pobiera od użytkownika współrzędne x,y narożników dwóch działek w kształcie trójkąta.
  • program powinien sprawdzić czy działki nachodzą na siebie.
    -jeżeli tak program oblicza pole powierzchni obszaru wspólnego.
  • jeżeli nie program wyświetla komunikat.

Przykładowe dane:

Działka 1

nr x y
1 496.000 214.000
2 496.000 488.000
3 740.000 340.000
Działka 2
nr x y
1 705.000 523.000
2 540.000 330.000
3 540.000 867.000

dodanie znaczników <code> dla przykładowych danych + usunięcie sufiksu w tytułu wątku - fp

0

ale w czym problem? Umiesz to policzyc matematycznie i nie wiesz jak to napsiac z programowania, lub nie wiesz nawet jak matematycznie to policzyc?

0

Nie wiem jak napisać to w C. Wprowadzić współrzędne umiem niby. Coś takiego na razie stworzyłem:

#include <stdio.h>
#include <stdlib.h>

int main()
{
puts("Podaj wspolrzedne wierzcholkow pierszego trojkata\n");

float x1;		
printf("Podaj wspolrzedna X pierwszego wierzcholka\n");
scanf("%f",&x1);
printf("X1=%f\n",x1);

float y1;		
printf("Podaj wspolrzedna Y pierwszego wierzcholka\n");
scanf("%f",&y1);
printf("Y1=%f\n",y1);

float x2;		
printf("Podaj wspolrzedna X drugiego wierzcholka\n");
scanf("%f",&x2);
printf("X2=%f\n",x2);

float y2;		
printf("Podaj wspolrzedna Y drugiego wierzcholka\n");
scanf("%f",&y2);
printf("Y2=%f\n",y2);

float x3;		
printf("Podaj wspolrzedna X trzeciego wierzcholka\n");
scanf("%f",&x3);
printf("X3=%f\n",x3);

float y3;		
printf("Podaj wspolrzedna Y trzeciego wierzcholka\n");
scanf("%f",&y3);
printf("Y3=%f\n",y3);
puts("Nacisnij dowolny klawisz, aby kontynuowac");
getch();

system("cls");
puts("Wspolrzedne wierzcholkow tego trojkata to:");
// Tu chciałbym wyswietlic 1: X=(warosc x1) Y=(wartosc y1)
                                        2: X = (..) itd.
}
0

I powiadasz, że sam to napisałeś...?
To co robi linijka:

printf("X1=%f\n",x1);

i dlaczego nie potrafisz jej przerobić na:

// Tu chciałbym wyswietlic 1: X=(warosc x1) Y=(wartosc y1)

?

http://www.cplusplus.com/reference/cstdio/printf/
Na dole masz trochę przykładów.

0

Ok, to z tym już sobie poradziłem.
Najgorzej nie wiem jak z tym:

  • program powinien sprawdzić czy działki nachodzą na siebie.
    -jeżeli tak program oblicza pole powierzchni obszaru wspólnego.
1

Wartość: (ax-cx)*(by-cy)-(ay-cy)*(bx-cx) będzie zerowa jeżeli c leży na prostej a-b, będzie mniejsza od zera jeżeli c leży po lewej od a-b, będzie większa od zera jeżeli c leży po prawej od a-b.
Wartość: fabs((ax-cx)*(by-cy)-(ay-cy)*(bx-cx))/2 - to pole trójkąta abc

Jeżeli jakikolwiek wierzchołek jednego trójkąta leży po jednej stronie każdego ze stron drugiego a-b, b-c, c-a to znaczy że trójkąty się pokrywają.
Obliczasz przecięcie i wyliczasz pola.

EDIT: Wg sugestii od @bogdans (patrz komentarze) w tekście wyżej chodzi o "prostą skierowaną".

0

OK. Na chwilę obecną wygląda to tak:

#include <stdio.h>
#include <stdlib.h>

int main()
{
puts("Podaj wspolrzedne wierzcholkow pierszego trojkata:\n");
printf("Czesci dziesietne od calosci oddzielaj kropka\n");
printf("\n");

float x1;		
printf("Podaj wspolrzedna X pierwszego wierzcholka:\n");
scanf("%f",&x1);

float y1;		
printf("Podaj wspolrzedna Y pierwszego wierzcholka:\n");
scanf("%f",&y1);

float x2;		
printf("Podaj wspolrzedna X drugiego wierzcholka:\n");
scanf("%f",&x2);

float y2;		
printf("Podaj wspolrzedna Y drugiego wierzcholka:\n");
scanf("%f",&y2);

float x3;		
printf("Podaj wspolrzedna X trzeciego wierzcholka:\n");
scanf("%f",&x3);

float y3;		
printf("Podaj wspolrzedna Y trzeciego wierzcholka:\n");
scanf("%f",&y3);
printf("\n");
puts("Nacisnij dowolny klawisz, aby kontynuowac...");
getch();

system("cls");
puts("Wspolrzedne wierzcholkow tego trojkata to:");
printf("1: X=%f ",x1); printf(" Y=%f\n",y1);
printf("2: X=%f ",x2); printf(" Y=%f\n",y2);
printf("3: X=%f ",x3); printf(" Y=%f\n",y3);
puts("Nacisnij dowolny klawisz, aby kontynuowac...");
getch();

system("cls");
puts("Podaj wspolrzedne wierzcholkow drugiego trojkata:\n");

float x4;		
printf("Podaj wspolrzedna X pierwszego wierzcholka:\n");
scanf("%f",&x4);

float y4;		
printf("Podaj wspolrzedna Y pierwszego wierzcholka:\n");
scanf("%f",&y4);

float x5;		
printf("Podaj wspolrzedna X drugiego wierzcholka:\n");
scanf("%f",&x5);

float y5;		
printf("Podaj wspolrzedna Y drugiego wierzcholka:\n");
scanf("%f",&y5);

float x6;		
printf("Podaj wspolrzedna X trzeciego wierzcholka:\n");
scanf("%f",&x6);

float y6;		
printf("Podaj wspolrzedna Y trzeciego wierzcholka:\n");
scanf("%f",&y6);
printf("\n");
puts("Nacisnij dowolny klawisz, aby kontynuowac...");
getch();

system("cls");
puts("Wspolrzedne wierzcholkow tego trojkata to:");
printf("1: X=%f ",x4); printf(" Y=%f\n",y4);
printf("2: X=%f ",x5); printf(" Y=%f\n",y5);
printf("3: X=%f ",x6); printf(" Y=%f\n",y6);
puts("Nacisnij dowolny klawisz, aby kontynuowac...");
getch();
}

Mógłbyś mi wskazać jak teraz zrobić to sprawdzenie, bo nie za bardzo rozumiem jak miałoby to wyglądać w języku C?

0

@wasiu, prosty algorytm:

  1. Najpierw czytasz to:
    http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Instrukcja-warunkowa-if-else/16

  2. Potem znów post @_13th_Dragon.

  3. Na koniec próbujesz sam, i jeśli nie wychodzi - pokazujesz co wykombinowałeś i opisujesz z czym masz problem.

0

Próbowałem zrobić z czegoś takiego:

int y12;
y12=(((y2-y1)*(x-x1))/(x2-x1))+y1;
printf ("",&y12);

Tylko jak wiadomo nie mam x, no i program nie może tego wyliczyć.

dodanie znacznika <code class="c"> - fp

Teraz coś liczy, ale nie wiem czy to dobrze...

float x,y;
 for(x>=x1; x<=x2; x++);
 
y=(((y2-y1)*(x-x1))/(x2-x1))+y1;
printf ("wynik:  %f",y);
getch();
0

Mógłby ktoś pomóc? :) Jestem właśnie na zaliczeniu i stoje w miejscu jak na razie...

0

Wartość: (ax-cx)(by-cy)-(ay-cy)(bx-cx) będzie zerowa jeżeli c leży na prostej a-b, będzie mniejsza od zera jeżeli c leży po lewej od a-b, będzie większa od zera jeżeli c leży po prawej od a-b.
Wartość: fabs((ax-cx)(by-cy)-(ay-cy)(bx-cx))/2 - to pole trójkąta abc

A twoje:

float x,y;
 for(x>=x1; x<=x2; x++);
 
y=(((y2-y1)*(x-x1))/(x2-x1))+y1;
printf ("wynik:  %f",y);
getch();

Jaki to ma zwiazek, z tym co napisal @_13th_Dragon...? Jakikolwiek...? Ja nie widzę...

Jestem właśnie na zaliczeniu i stoje w miejscu jak na razie...

Sory, czas pogodzić się z tym, że na zaliczenie to trzeba się przygotować... Szczerze mówiąc - nie masz szans. A wiesz dlaczego?

for(x>=x1; x<=x2; x++);

Ta jedna linijka pokazuje, że totalnie nie wiesz co robisz.

0

Bardzo chętnie nauczyłbym się tego języka, ale nie jestem na studiach informatycznych, tylko na geodezyjnych i jakiś "Pan" wymślił sobie, że na drugich zajęciach sami to zrobimy...

0

Moja rada nie pakuj wszystkiego do main. Napisz kilka funkcji robiące drobne zadania. Jeśli będziesz próbował wszystko zrobić w jednej funkcji za jednym zamachem to zaraz ci mózg eksploduje.
Potrzebujesz rozbić problem na mniejsze prostsze. Zacznij od napisania następujących małych funkcji:

  • wyznaczanie prostej na podstawie dwóch punków
  • wyznaczenie przecięcia prostych
  • sprawdzenie czy punkt na prostej znajduje się pomiędzy dwoma innymi punktami prostej

1 użytkowników online, w tym zalogowanych: 0, gości: 1