Geometria, brak pomysłu.

AS
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:2
0

Witam. Od poniedziałku próbuję rozwiązać jedno zadanko algorytmiczne, jednak moja cierpliwość co do szukania błędów i haczyków wyczerpała się. Dlatego zwracam się z prośbą o pomoc do Was.Jak rozwiązalibyście to zadanie http://www.spoj.com/WIPING5/problems/WIPING58/ ? Ogólnie wpadłem na pomysł, aby znajdować punkty z którymi prosta opisująca promień ma rozwiązania z prostą opisująca odcinki. Oczywiście, rozwiązanie musi należeć do odpowiedniego zakresu, w przypadku gdy mamy więcej niż jeden punkt, wybieram najbliższy. Potem promieniem jest prosta prostopadła do prostej opisującej promień przechodząca przez wybrany punkt.Natomiast, w którą stronę odbije się promień obliczam z położenia punktu względem prostej Mam wrażenie, że można to jakoś dużo prościej zrobić, ale niestety nie mam pomysłu.

edytowany 1x, ostatnio: Asthean
AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:14 dni
1
Asthean napisał(a):

gdy mamy więcej niż jeden punkt, wybieram najbliższy

A dlaczego tak? Nie widzę w zadaniu opisu, co robić w sytuacji, gdy promień trafi w zwierciadło dokładnie z boku.

Asthean napisał(a):

Potem promieniem jest prosta prostopadła do prostej opisującej promień przechodząca przez wybrany punkt

A dlaczego tak? Jak dla mnie trzeba użyć użyć zasady, że kąt padania równa się kątowi odbicia.

AS
Próbowałem coś przeliczać z tym kątem padania, jednak nie mogę z tego wyznaczyć równania promienia po odbici, albo nie wiem jak. Przekształcając wzór, rozpatruję dwa przypadki, jeden mi wychodzi sprzeczny, a drugi to pierwsza prosta. To w jaki sposób wyznaczyć równanie promienia odbitego?
AF
Nie wiem, jak je masz wyznaczyć, bo nie opisałeś swojej reprezentacji.
AS
Ogólnie to proste są reprezentowane w postaci struktury przechowującej współczynniki A, B, C, początkowy i końcowy punkt.
AF
No to baw się w kosinusy; albo wyznacz prostą prostopadłą do zwierciadła w punkcie przecięcia promienia i zwierciadła, a następnie odbij dowolny punkt promienia względem tej prostej, będziesz miał dwa punkty nowej prostej (jeden właśnie wyliczony, a drugi to przecięcie zwierciadła z promieniem) i z tego wylicz nową prostą.
AS
Zrobiłem według tego sposobu, jednak dalej 0. Niestety, muszę odpuścić to zadanie. Mimo to dziękuje za wszelką pomoc. :)
1

Hmm, z tego co widać
1 1 oznacza, że punkt to x = 1 i y = 1
a kolejne 1 0 oznacza, że porusza się x, a y się nie zmienia, czyli takich kombinacji jest tylko 4 wystrzeliwania lasera.

Musisz policzyć czy laser znajduje się w punktach określonych funkcjami liniowymi z ograniczeniem zbioru zwierciadła tzn. szerokości.
Liczysz punkt przecięcia prostych, lasera ze zwierciadłem.
Jeśli y zwierciadła rośnie i y lasera rośnie to przy rośnięciu x laser skręci w prawo, a tak w lewo itp.
Teraz jak liczysz kąt odbicia lasera to wystarczy, że znasz obie funkcje zwierciadła i lasera, i odwrócisz lasera o 180 stopni i masz kąt odbicia jaki będzie funkcji po kolizji z lustrem.

hauleth
Nie 4 tylko więcej, bo to są liczby zmiennoprzecinkowe a nie całkowite. Więc laser (w uproszczeniu) może poruszać się w dowolną stronę.
0

edit, tam miało być 8 kombinacji gdyż laser nie może stać w miejscu,
I lustrzane odbicie funkcji to wyliczenie prostopadłej do punktu przecięcia zwierciadła z laserem + rośnięcie w kierunku wyliczonym wcześniej.

0
Uczynny Mleczarz napisał(a):

edit, tam miało być 8 kombinacji gdyż laser nie może stać w miejscu,
I lustrzane odbicie funkcji to wyliczenie prostopadłej do punktu przecięcia zwierciadła z laserem + rośnięcie w kierunku wyliczonym wcześniej.

Masz daną prostą, po której leci laser, więc sprawdzasz tylko przecięcie z tymi zwierciadłami (odcinkami),
na których ta prosta się zmienia - zgodnie zasadami odbicia... no to tyle.
Prostacki problem o złożoności: n^2, n - liczba odcinków/zwierciadeł.

Trzeba uwzględnić jakiś limit tych odbić, np. 1000, ponieważ możliwe są pętle, np. taka:

|<-----laser sobie lata w nieskończoność-------->|

Patryk27
Testy są tak dobrane, że promień zawsze odbije się od skończonej liczby luster.
Althorion
Zamiast limitować odbicia, można po prostu kolorować zwierciadła, od których się już odbiło; jak się do jakiegoś wróci, to wiadomo że pętla.
Patryk27
Niekoniecznie - można wrócić pod innym kątem.
Althorion
A faktycznie. Więc ew. można by trzymać zbiór kątów odbicia i tego badać, ale to komplikuje zadanie na tyle, że limit odbić nabiera większego sensu.
0

Warunek pętli trochę inaczej wygląda: punkt i kierunek należy tu uwzględnić, czyli w sumie prostą po której leci laser...
więc należałoby to pamiętać i sprawdzać, czy się nie powtarza.

Niemniej i tak jest możliwe odbijanie pod niewielkim kątem pomiędzy dwoma lusterkami,
np. kąt: 0.001 dałby aż coś rzędu 1000 odbić, dla dwóch równoległych odcinków-lusterek o długości 1.0, i w odległości 1,
zanim wyleciałby poza brzeg lustra.

Grey_Ghoust
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:14
0

a jeśli jakieś zwierciadła będą zawierać się w każdym boku tego samego n-kąta foremnego ? Mamy wtedy sytuację odbijania się pod niewiele różniącym się kątem między n zwierciadłami.

Powinniśmy jeszcze móc wykryć sytuację, kiedy promień światła zostanie uwięziony między n-zwierciadłami. Współczynniki odpowiadających sobie promieni światła w każdym cyklu odbijania będą do siebie bardzo podobne. Najprościej :
|A_{k}-A_{k+n}| <= ΔA i | B_{k}- B_{k+n}| <=ΔB
Jeśli ten warunek zostanie spełniony to promień światła jest uwięziony. ΔA i ΔB powinny wynikać z błędu reprezentacji liczby zmiennoprzecinkowej.

edytowany 2x, ostatnio: Grey_Ghoust
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)