• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

problem - obliczenie pola przekroju powstałego w wyniku przesięcia szcześcianu płaszczyzną

Object Storage Arubacloud
0 głosów
361 wizyt
pytanie zadane 29 czerwca 2018 w Grafika i multimedia przez Piotr Perski Przeche Nowicjusz (120 p.)

Witam

Potrzebuje obliczyć pole przekroju powstałego w wyniku przecięcia płaszczyzną sześcianu

przykład

więcej kombinacji na tej stronie https://www.geogebra.org/m/aY75dEkf

dane:

wektor normalny do płaszczyzny oraz jeden punkt przecięcia płaszczyzny z sześcianem

komentarz 29 czerwca 2018 przez RafalS VIP (122,820 p.)
Nie masz współrzędnych sześcianu?
komentarz 29 czerwca 2018 przez Piotr Perski Przeche Nowicjusz (120 p.)
Przepraszam zapomniałem dodać, współrzędne sześcianu też są znane

2 odpowiedzi

0 głosów
odpowiedź 29 czerwca 2018 przez RafalS VIP (122,820 p.)
edycja 30 czerwca 2018 przez RafalS

Znalazłem implementacje oraz wzór z wyjaśnieniem na pole wielokąta 3d:

https://stackoverflow.com/questions/12642256/python-find-area-of-polygon-from-xyz-coordinates

I na tej stronce wzór:

http://geomalgorithms.com/a01-_area.html#3D%20Polygons

gdzie A(omega) to pole, n to wektor normalny płaszczyzny, operator x to iloczyn wektorowy (jeśli nie wiesz jak go policzyć to tu jest wzór: http://www.naukowiec.org/wzory/fizyka/iloczyn-wektorowy-dwoch-wektorow_869.html), kropka to iloczyn skalarny wektorów (paragraf przykłady najlepiej obrazuje jak się go liczy: https://pl.wikipedia.org/wiki/Iloczyn_skalarny). Sumy chyba nie musze tłumaczyć :P

Nie wiem w czym piszesz, ale generalnie to zrób sobie klase punkt z 3 współrzędnymi i metody lub funkcje na te operatory wektorowe, bo to bardzo ułatwi zadanie.

Teraz potrzebujemy jeszcze znaleźć werzchołki naszego wielokąta. Co można by zrobić numerycznie. Każdy wierzchołek naszego wielokąta będzie przecięciem płaszczyzny z krawędzią sześcianu. Można przeiterować po krawędziach z bardzo małym skokiem i sprawdzać ze wzoru płaszczyzny czy trafiliśmy punkt wspólny, z jakąśtam dokładnością :D Np z dokładnością będącą długością pojedyńczego kroku po krawędzi. Bardzo możliwe, że da się to zrobić łatwiej, jak na coś wpadne to dam znać - wpadłem patrz na drugi komentarz :P.

 

 

komentarz 30 czerwca 2018 przez RafalS VIP (122,820 p.)
edytowałem, rzuć okiem
0 głosów
odpowiedź 30 czerwca 2018 przez RafalS VIP (122,820 p.)
To znowu ja. Pisze w osobnym komentarzu żeby pytanie skoczyło do góry i żeby ewentualnie ktoś zweryfikował tok myślenia.

Oto jak wyliczyć punkty przecięcia płaszczyzny z sześcianem, które wykorzystasz do policzenia pola zgodnie z rozumowaniem w pierwszym komentarzu:

https://imgur.com/a/toMy6Tx

Generalnie cały proces bardzo dobrze powinien się algorytmizować, bo w programie streści się to do jednego bardzo dużego wzoru na parametr t.

Więc moja propozycja jest ostatecznie taka:

1. Wyznacz pary punktów, które są wierzchołkami krawędzi. Mój pomysł na szybko to wybrać pierwszego lepszego i policzyć odległości od niego do całej reszty. Te dla których odległość wyjdzie najmniejsza tworzą krawędzie, będzie ich 3. Kolejna trójka równooodległych ale dalszych niż pierwsza to będą te z których trzeba powtórzyć proces żeby znaleźć znaleźć wszystkie krawędzie. Czyli dostajesz wszystkie 12 krawędzi. Jak to zaprojektujesz w programie to już Twoja sprawa, ja bym to pisał obiektowo :P.

2. Dla każdej pary punktów będących krawędzią lecimy rozumowanie wrzucone w linku. W programie najlepiej zrób sobie 2 funkcje - jedna liczy licznik tego wzoru druga mianownik. Sprawdzasz czy licznik i mianownik różne od 0. Jeśli tak to dla danego t wyznaczasz x,y,z ze wzorów parametrycznych (x = x0 + t*a, y = y1 + t*b...). Oczywiście weryfikujesz czy ten punkt leży pomiędzy wierzchołkami krawędzi, bo on może wyjść gdzieś daleko poza sześcianem. Jeśli obydwa licznik i mianownik rowne 0 to prosta leży na płaszczyźnie, wtedy punkty przecięcia potrzebne do kolejnego kroku to po prostu wierzchołki krawędzi. Jeśli jeden sie wyzeruje a drugi nie to płaszczyzna nigdy nie przecina prostej, nie mamy punktów przecięcia.

3. Wyznaczone punkty przecięcia wykorzystujemy we wzorze z 1. komentarza. Zaimplementuj wszystkie te operacje wektorowe, iloczyn skalarny i wektorowy i wuala masz analitycznie dokładne pole powierzchni :P (niestety z niedokładnościami wynikającymi z używania liczb zmiennoprzecinkowych, ale tego nigdy nie unikniesz).

Zakodziłbym sobie to dla zabawy, ale musze pisać inny projekt. Jak bd miał czas to napisze i sie odezwe :P Generalnie to powinno zadziałać, ale pewności nie ma dopóki to nie zadziała :P
komentarz 4 lipca 2018 przez Piotr Perski Przeche Nowicjusz (120 p.)
Ad 1. Twój sposób wyznaczania krawędzi jest dobry wykorzystam, ale niestety mój sześcian doznaje później deformacji i niekoniecznie najmniejsza odległość od punktów tworzy krawędź (patrz rąb)

uznajmy że tym przypadkiem zajmę się później

 

Ad 3. wzór działa jedynie w przypadku gdy nr węzłów są ustawione po kolei 1 2 3... itd

w procesie wyliczania punktów przecięcia nie mam kontroli nad kolejnością

ilustracja problemu https://zapodaj.net/8e8d986928e63.jpg.html
komentarz 6 lipca 2018 przez RafalS VIP (122,820 p.)

Też mnie nie było kilka dni :P

1. No to troszke komplikuje znajdywanie krawędzi, pomyślę jak można by to obejść.

3. Słuszna uwaga, nie pomyślałem o tym. Można by spróbować jakoś je poustawiać w kolejności np startujemy od losowego punktu i szukamy najblizszego sasiada, jesli nie jest juz na liscie to go dodajemy itd. Nie jestem pewien czy to zadziała, ale można spróbować.

A ogólnie te wszystkie trudności sugerują użycie większego brute forca, czyli metod numerycznych a dokładniej metody monte carlo. Nie wiem czy da się to zrobić, ale trzeba by:

  • wyznaczyć jakąś płaszczyzne pokrywająca się z naszym przekrojem taką której jesteśmy w stanie obliczyć pole oraz sprawdzać czy punkt należ do tej płaszczyzny - najlepiej pewnie kwadratu
  • weryfikować czy punkt leży w środku sześcianu
  • losować punkty leżące na wybranej płaszczyznie pomocniczej np kwadraci

Wtedy wystarczy wylosować sporo punktów i obliczyć stosunek tych które trafiły w przekrój do wszystkich, przemnożyć ten stosunek razy pole kwadratu i wuala mamy jakieś przybliżenie pola przekroju. Jeśli ma być dokładne to trzeba będzie sporo tych punktów wylosować, co spowolni działanie, ale zadziała :P.

 

Podobne pytania

0 głosów
1 odpowiedź 3,303 wizyt
pytanie zadane 5 czerwca 2020 w C i C++ przez KeLaN Nowicjusz (150 p.)
0 głosów
0 odpowiedzi 1,529 wizyt
pytanie zadane 3 listopada 2019 w C i C++ przez michalMonster Początkujący (390 p.)
0 głosów
1 odpowiedź 1,115 wizyt
pytanie zadane 18 marca 2018 w C i C++ przez Bartek Kotarski Początkujący (480 p.)

92,537 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...