Odległość punktu od środka okręgu

Odległość punktu od środka okręgu
Manna5
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 685
1

Oto funkcja sprawdzająca przynależność punktu do kwadratu.

Kopiuj
char w_kwadr (int px, int py, int kx, int ky, int a)
{
  return px >= kx && px <= kx + a
      && py >= ky && py <= ky + a;
}

I np. w_kwadr (12, 34, 10, 10, 20) to sprawdzenie, czy punkt (12,34) należy do kwadratu o boku 20 zaczynającego się od punktu (10,10).

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3359
0

Wprowadzasz Oxy, Pxy, r
Liczysz V = O-P // Xp-Xo, Yp-Yo
Liczysz Rsquared = r^2
Liczysz VnormSquared //czyli Vx^2 + Vy^2

JEŻELI VnormSquared == Rsquared >> leży na okręgu
JEŻELI VnormSquared < Rsquared >> leży wewnątrz okręgu
JEŻELI VnormSquared > Rsquared >> leży na zewnątrz okręgu

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7103
1

@piotrpo: okręg już zrobiony:

Odległość punktu od środka okręgu

Teraz OP męczy się z kwadratem:

Odległość punktu od środka okręgu

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0
Spine napisał(a):

Bo to jest tak idiotycznie proste zadanie, że wystarczy jak sobie to narysujesz.
Punkt w kwadracie w układzie współrzędnych...
Punkt poza kwadratem w układzie współrzędnych...
No i spróbuj rozwiązać postawione zadanie z danymi jakie otrzymałeś.
Dojdziesz do takiego samego wzoru, jaki Ci podałem.

Zrobiłem taki rysunek kwadrat.png
I co dalej? Wybieram, któryś z punktów P np. ten w kwadracie i obliczam jego odległość od miejsca przecięcia(punktu O)?

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Tak wyglądałby ten schemat dla Px:
px.png

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Sorry za jakość. Jakby coś było nieczytelne to prosze pisać.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7103
0
piotrek1998 napisał(a):

Zrobiłem taki rysunek screenshot-20231014164619.png

Kadruj te swoje rysunki! (powyżej wkleiłem przycięty)
Przypomnij sobie treść zadania: ...kwadrat o punkcie przecięcia przekątnych w O(x0 , y0)...
Przekątne kwadratu mają przecinać się dokładnie na środku kwadratu!

piotrek1998 napisał(a):

I co dalej? Wybieram, któryś z punktów P np. ten w kwadracie i obliczam jego odległość od miejsca przecięcia(punktu O)?

Nie o to chodzi. Chodziło mi o to, że sobie na ilustrację nanosisz odpowiednie oznaczenia, na podstawie których powinieneś wymyślić wzory.
Naniosłem 4 punkty (współrzędne kątów kwadratu):

screenshot-20231014165914.png

Zauważ, że współrzędne punktu P wewnątrz kwadratu mają się mieścić w przedziałach między czarnymi punktami i to jest Twój algorytm.

Tutaj będzie trochę więcej bloczków warunkowych niż w przypadku okręgu. Bo nawet jeśli punkt mieści się w pionie, to nie musi się mieścić w poziomie itd.

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0
Spine napisał(a):

Nie o to chodzi. Chodziło mi o to, że sobie na ilustrację nanosisz odpowiednie oznaczenia, na podstawie których powinieneś wymyślić wzory.
Naniosłem 4 punkty (współrzędne kątów kwadratu):

screenshot-20231014165914.png

Rozumiem, że te 4 punkty, które naniosłeś (O.x - 0.5a, O.y + 0.5a), (O.x + 0.5a, O.y - 0.5a), (O.x - 0.5a, O.y - 0.5a), (O.x + 0.5a, O.y - 0.5a) stwierdzam czy dany punkt należy do kwadratu czy nie? Dobrze rozumiem? Czy powinienem coś innego z nimi zrobić?

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3359
1

Potraktujcie P i O jako wektory, przesuńcie P o -O, policzcie max(abs(Ox), abs(Oy)) i jak jest większe, mniejsze, równe a/2 to odpowiednio jest wewnątrz, na zewnątrz, na brzegu kwadratu.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7103
0

@piotrek1998: Te punkty mają Ci pokazać przedziały. Dwa przedziały w których ma się mieścić punkt P, aby stwierdzić, czy jest on w kwadracie.
Przedział na osi X oraz przedział na osi Y.

Rozwiązanie @piotrpo pewnie uprości schemat blokowy, więc zrób tak jak on napisał.

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Czy to o czym napisałeś @Spine : te punkty(O.x - 0.5a, O.y + 0.5a), (O.x + 0.5a, O.y - 0.5a), (O.x - 0.5a, O.y - 0.5a), (O.x + 0.5a, O.y - 0.5a) trzeba zapisać gdzieś do zmiennej, wyliczyć i sprawdzić warunki np.blok.jpg
nie mam już pomysłu na to. No ja cały czas właśnie myśle, że trzeba wyliczyć te współrzędne dla Px, Py, Ox, Oy z tego o czym ty mówisz @Spine , a potem podstawiać w warunkach dla Px, Py, Ox, Oy i sprawdzać czy leży poza kwadratem w nim czy na nim.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7103
2

Tak wygląda "implementacja" algorytmu zaproponowanego przez @piotrpo

screenshot-20231014194652.png

Do pobrania: PinSQUARE_Flowgorithm.zip

// edit: poprawka dodająca wartości bezwzględne.

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3359
2

na początku są deklarowane zmienne punktu P wraz z wartościami x i y, a także współrzędne punktu O też z wartościami x i y no i dochodzi długość boku a, tylko nie bardzo wiem po co zmienna aHalf i maxP? aHalf to rozumiem, że to połowa długości boku kwadratu. Potem są wprowadzane wartości dla punktu P i O oraz długość boku a. Po co są te zmienne aHalf i maxP

Na początek wykonujemy przesunięcie całego układu (kwadrat + punkt P), tak, żeby kwadrat miał swój środek w początku układu współrzędnych
screenshot-20231014200446.png

Jak już to mamy, to rogi tego kwadratu są w punktach:

  • (aHalf, aHalf)
  • (aHalf, -aHalf)
  • (-aHalf, -aHalf)
  • (-aHalf, aHalf)

Spostrzeżenie: kwadrat jest symetryczny względem osi X, oraz Y

Punkt P, może być w dowolnej ćwiartce układu współrzędnych. Upraszczamy sytuację i upewniamy się, że po zastosowaniu odbicia przez X, lub Y znajdzie się w pierwszej ćwiartce (obie współrzędne nieujemne). Px = abs(Px); Py = abs(Py) (na diagramie @Spine masz od razu z przesunięciem do środka układu).

Spostrzeżenie: punkt P, znajdujący się w I ćwiartce układu współrzędnych, będzie znajdował się wewnątrz kwadratu, wtedy i tylko wtedy, kiedy obie jego współrzędne będą mniejsze niż aHalf. Skoro tak, wystarczy sprawdzić ten warunek jedynie dla większej wartości, stąd zastosowanie funkcji max(), bo skoro ta większa się mieści, to i mniejsza się mieści, a jak większa się nie mieści, to mniejsza nie ma znaczenia.

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Czy to już wszystko jeśli idzie o to zadanie?

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7103
2

@piotrek1998: W sumie nie jest tak źle, tylko trzeba zrobić inne obliczenia i napisać długie warunki.

screenshot-20231014223345.png
Do pobrania: PinSQUARE2_Flowgorithm.zip

Pierwsza instrukcja warunkowa sprawdza, czy punkt mieści się w przedziałach na osi X, Y w kwadracie (ale nie na krawędzi).
Druga instrukcja sprawdza, czy punkt wychodzi poza kwadrat z którejkolwiek strony.

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Dzięki chłopaki

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7103
1

Zobacz sobie jeszcze co Chat GPT mówi o tym problemie: https://chat.openai.com/share/31edeeab-5748-442a-89f7-fab52470eab2
Musiałem go naprowadzić na rozwiązanie, bo na początku zrobił jak dla okręgu...
Ale potem zrobił tak jak ja.

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Witam ponownie szanownych forumowiczów. Przychodze do was z pewnym problemem jak zwykle ale nie bardzo wiem jak sobie z tym poradzić. Problem jest tego typu:

Znaleźć najmniejszą spośród n różnych liczb (wersja iteracyjna - z petlą).

Zadanie rozwiązałem połowicznie. Tutaj jest jakby etap wstępny:
zad4.jpg
zrobiłem to oczywiście na tablicy. Pewnie jest inny sposób ale ja na razie innego nie chce. To co tutaj jest dodaje mi elementy do tej tablicy. Pytanie tylko co bym musiał jeszcze dodać aby znaleźć najmniejszą wartość w tablicy?

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3359
1

no zrób sobie jakąś zmienną, np. minLiczba, przypisz jej maksymalną wartość, jak użytkownik podaje jakąś liczbę, to ją porównujesz z tą minLiczba i jak wprowadził mniejszą, to używasz wprowadzonej wartości do nadpisania zmiennej. Na koniec drukujesz co jest w minLiczba i job done
nawet nie musisz mieć w tym układzie żadnej tablicy.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7103
0

Tak jak pisze @piotrpo
Zazwyczaj takie algorytmy działają "przelotowo".
Nie zachowujemy w tablicy danych, które możemy przetworzyć zaraz po wczytaniu.

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Próbowałem zrobić coś takiego ale nie działa
alg.jpg

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

A da się w ogóle zrobić to tablicą?

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3359
2

Da się

Kopiuj
int tab[] = {5, 4, 3, 2, 1}
int minNum = tab[0]
for(int i = 0; i< tab.size;i++){
  if(tab[i]<minNum){
    minNum = tab[i]
  }
}
print(minNum)
P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 640
0

Wiem, że może nie bardzo trafiony pomysł z tą tablicą ale twój przypadek @piotrpo stosuje niemal każdy, a chciałem czegoś innego.

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3359
2

No ale po co inaczej? Tego nie da się zrobić lepiej niż przejść przez wszystkie elementy czy to tablicy, czy to danych wprowadzanych przez użytkownika i wybrać właściwy.

Manna5
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 685
2

screenshot-20231024205351.png

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7103
1
piotrek1998 napisał(a):

Próbowałem zrobić coś takiego ale nie działa
alg.jpg

Wygląda jakbyś zrobił byle co i miał nadzieję, że to będzie poprawnie liczyć...

No i układaj te bloczki po ludzku.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.