Súradnice bodov na priamke – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Súradnice bodov na priamke – Pascal – Fórum – Programujte.comSúradnice bodov na priamke – Pascal – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Jozef010
Newbie
13. 9. 2017   #1
-
0
-

Zdravím,

mám problém s jedným programom.

Úlohou je určiť, či ležia body so zadanými súradnicami na dvoch priamkách.

Ako vstup sú zadané súradnice jednotlivých bodov.

 Napríklad:

0 1
3 4
10 11
5 0
6 2
8 6


Vyzerá to takto:

V príklade je vstup, kde sú všetky body na 2 priamkách, keby tam bol ešte [2,10], už by neležal na žiadnej z priamok.

Čo platí o súradniciach bodov ležiacich na jednej priamke?

Ďakujem za odpoveď

Nahlásit jako SPAM
IP: 212.26.187.–
gna
~ Anonymní uživatel
1849 příspěvků
13. 9. 2017   #2
-
0
-

Asi nejjednodušší je na to jít tak, že mezi všemi body na jedné přímce je stejný (nebo opačný) jednotkový vektor.

Takže vezmeš dva body určující jednu přímku a najdeš další body, které na ní leží. Pokud žádné body nezbyly, tak všechny leží na jediné přímce.
Podobně se zbytkem bodů (pokud nějaké zbyly) pro druhou přímku (když nebudou aspoň 2, tak i 1 znamená další přímku). Pokud teď žádné body nezbyly, tak máš jen dvě přímky. Jinak je jich více.

Takhle to vyzkoušíš pro různé počáteční přímky (stačí měnit jeden bod) a budeš hledat jestli ti někdy vyjdou 2 přímky.

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
3981 příspěvků
14. 9. 2017   #3
-
0
-

Ono, zalezi na tom, zda hledas realnou primku nebo pixelovou. Pro realnou primku plati
y = k * x + q
Dosadis dva body x,y, 2, rovnice, 2 nezname, dopocitas k a q.
Kdyz mam dalsi bod, dosadis do rovnice jeho x,y a pred chvili vypocitane k,q a msi vyjit L=P leva = prava strane, cili, 0=0. Kdyz ne, bod nelezi na teto primce.
Viz matematika, stredni skola.

Kdyz nevis, ktere z toho lezi na jake primce, tak musis pro vsechny body, kazde 2, vypocitat k,q.

Nebo, jak popisuje gna, muzes spocitat vektory, rozdil souradnic dvou bodu, dx, dy.
y1 = k * x1 + q
y2 = k * x2 + q
q je posunuti na ose x, kdyz primka nezacina v 0,0. To je v pripade dvou bodu na primce stejne, jako k. Udelas rozdil obou rovnic.
y1-y2 = k * (x1-x2)
k12 = dy12 / dx12
k23 = dy23 / dx23
k12 = k23
Kdyz body lezi na primce, tak jim souradnice x,y narustaji nasobenim pomoci k. Viz matika, trojuhelniky. Kdyz pravouhly trojuhelnik zvetsujes, zustava zachovany pomer mezi b,c.
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:4591:d0...–
Jozef010
Newbie
14. 9. 2017   #4
-
0
-

Ďakujem,

body ležia na skutočnej priamke a ich súradnice sú len celočíselné.

Neviem, ktorý bod leží na ktorej a cieľom úlohy je zistiť, či je niektorý mimo.

Skúsim to nejako spraviť a dám vedieť, ako som dopadol.

Nahlásit jako SPAM
IP: 178.41.108.–
Jozef010
Newbie
20. 9. 2017   #5
-
0
-

Podarilo sa mi to správne určiť, ale len keď boli na uhlopriečke (z príkladu body 1, 2, 3).

@peter  nerozumiem tej druhej časti s tými rovnicami. Tie čísla sú indexy alebo koeficienty?

Ďakujem

Nahlásit jako SPAM
IP: 212.26.187.–
gna
~ Anonymní uživatel
1849 příspěvků
21. 9. 2017   #6
-
0
-

Těžko říct, kde je problém, když neukážeš kód. Při přepočtech může dojít k drobným odchylkám, tak konečné porovnání dělej s nějakou tolerancí.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1849 příspěvků
21. 9. 2017   #7
-
+1
-
Zajímavé

Tak jsem to zkusil přes ty vektory s odebíráním bodů z pole. Moc si Pascal nepamatuju a líp to nevymyslím.

uses
  math;

type
  TPoint = record
    x, y: real;
  end;

  TList = array of TPoint;

function xround(value: real; places: integer): real;
var
  muldiv: real;
begin
  muldiv := power(10, places);
  xround := round(value * muldiv) / muldiv;
end;

function samevec(A, B, C: TPoint): boolean;
var
  bx, by: real; // vec A -> B
  cx, cy: real; // vec A -> C
  lb, lc: real; // len AB, len AC
begin
  bx := B.x - A.x;
  by := B.y - A.y;
  cx := C.x - A.x;
  cy := C.y - A.y;

  lb := sqrt(bx * bx + by * by);
  lc := sqrt(cx * cx + cy * cy);

  // normalize
  bx := xround(bx / lb, 3);
  by := xround(by / lb, 3);
  cx := xround(cx / lc, 3);
  cy := xround(cy / lc, 3);

  samevec := ((bx = cx) and (by = cy)) or ((bx = -cx) and (by = -cy));
end;

function remove(var list: TList; idx: integer): TPoint;
var
  i: integer;
begin
  remove.x := 0;
  remove.y := 0;
  if idx < length(list) then
    begin
      remove := list[idx];
      for i := idx to length(list) - 2 do
        list[i] := list[i + 1];
      setlength(list, length(list) - 1);
    end;
end;

var
  i, j, lines: integer;
  list, work: TList;
  A, B: TPoint;

begin
  while not eof(input) do
    begin
      setlength(list, length(list) + 1);
      with list[length(list) - 1] do
        readln(x, y);
    end;

  if length(list) < 3 then
    begin
      writeln('ne');
      exit;
    end;

  lines := 0;

  for i := 1 to length(list) - 1 do
    begin
      work := copy(list, 0, length(list));

      lines := 1;

      B := remove(work, i);
      A := remove(work, 0);
      for j := length(work) - 1 downto 0 do
        if samevec(A, B, work[j]) then
          remove(work, j);
      if length(work) = 0 then
        break;

      lines := 2;

      A := remove(work, 0);
      B := remove(work, 0);
      for j := length(work) - 1 downto 0 do
        if samevec(A, B, work[j]) then
          remove(work, j);
      if length(work) = 0 then
        break;

      lines := 3; // or more
    end;

  if lines = 2 then
    writeln('ano')
  else
    writeln('ne');
end.
Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý