Napište program hledající průsečíky zadaných bodů s osami – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Napište program hledající průsečíky zadaných bodů s osami – C / C++ – Fórum – Programujte.comNapište program hledající průsečíky zadaných bodů s osami – C / C++ – Fórum – Programujte.com

 

Kubas880
Newbie
12. 11. 2012   #1
-
0
-

Dobrý den,

mohl bych se zeptat jak by se dal řešit tento program?

Zde je zadání:

- chování programu pro zadané body bude stejné jako v níže uvedenýcg příkladech
- program bude od uživatele brát zadávané souřadnice bodu, dokud uživatel nezadá bod [0,0], tím program skončí a vypíše se lehká statistika (mezi jakými body byly jaké průsečíky s jakýma osama), viz. příklady
- uživatel zadává souřadnice bodů [x,y] a program mu postupně píše souřadnice bodů průniku os a spojnice předchoziho a aktuálního bodu


- program bude obsahovat alespoň 3 funkce (minimálně main a 2 dalsi)
- nemusíte testovat vstup (např. ze je zadané číslo)
- jako průsečík s osou neuvažujte případy dotyku s osou, tj. např. [1,1] - [0,5]

Příklady:

cout << points << ". bod souradnice " << endl << "x = ";
cin >> xnew;
cout << "y = ";
cin >> ynew;

1. bod souradnice
Program hledajici pruseciky spojnic bodu s osami.
++++

priklad behu - kdyz jde spojnice po ose a dalsi
1. bod souradnice
x = 1
y = 0
2. bod souradnice
x = 3
y = 0
3. bod souradnice
x = -2
y = 0
# y prusecik [0,0]
4. bod souradnice
x = 3
y = -5
# y prusecik [0,-2]
5. bod souradnice
x = -2
y = 4
# y prusecik [0,0.4]
# x prusecik [0.222222,0]
6. bod souradnice
x = 0
y = 2
7. bod souradnice
x = 0

nebo:

Program hledající průsečíky spojnic bodů s osami.
++++
1. bod souradnice
x = -1
y = 2
2. bod souradnice
x = 5
y = -2
# y prusecik [0,1.33333]
# x prusecik [2,0]
3. bod souradnice
x = 0
y = 8
# x prusecik [4,0]
4. bod souradnice
x = -2
y = 3
5. bod souradnice
x = 4
y = -3
# y prusecik [0,1]
# x prusecik [1,0]
6. bod souradnice
x = 0
y = 0
++++
x pruseciky : 1-2[2,0] 2-3[4,0] 4-5[1,0]
y pruseciky : 1-2[0,1.33333] 4-5[0,1]
Pocet zadanych bodu : 6
y = 0
++++
x pruseciky : 4-5[0.222222,0]
y pruseciky : 2-3[0,0] 3-4[0,-2] 4-5[0,0.4]
Pocet zadanych bodu : 7

Nahlásit jako SPAM
IP: 160.217.224.–
ondra.holub+1
Stálý člen
12. 11. 2012   #2
-
0
-

Vyjdeš z rovnice přímky y = ax + b. Dosazením souřadnic dvou zadaných bodů za x a y dostaneš dvě lineární rovnice. Z nich vypočítáš a a b. Takže máš rovnici přímky. Průsečík přímky s osou x získáš dosazením nuly za y. Pro osu y obráceně. Toto si napiš na papír, vypočítej si to obecně a máš vzorečky pro program. Nezapomeň na případ, kdy budou body stejné - mohlo by dojít k dělení nulou.

Za průsečík úsečky s osou x to podle zadání můžeš považovat jenom tehdy, když souřadnice y prvního a druhého bodu jsou nenulové a zároveň je jedna z nich kladná a druhá záporná. Analogicky pro osu y. Tuto kontrolu můžeš udělat ještě než vůbec budeš zkoušet řešit ty rovnice.

Nahlásit jako SPAM
IP: 192.35.17.–
Kubas880
Newbie
12. 11. 2012   #3
-
0
-

#2 ondra.holub
 

Tak nápad by nějaký byl, bohužel nevím jak to zapsat.Funkci pro výpočet výpočet bodů bych hodil jako zvlášť, kterou bych pak volal, pozadání souřadnic x1,y1,x2,y2?  Přes 2d pole bych to ani nemusel řešit ne?

díky

Nahlásit jako SPAM
IP: 160.217.224.–
reciproke0
Návštěvník
12. 11. 2012   #4
-
0
-

#3 Kubas88
Vždyť vše je na tvé volbě, jak si to uděláš, ale první co potřebuješ je ta rovnice přímky y = ax + b. Častěji se značí jako y = kx + q. To máš jednu funkci, další můžeš mít na zjištění půniků osou a jeho případný výpočet jak uvádí ondra.holub.

Pokud nevíš jak na tu rovnici přímky TADY to máš, vše je jen o tužce, papíru a vyjádření toho co potřebuješ ;-)

edit: oprava.... vlastně rovnici přímky potřebuješ jen tehdy když dojde k průniku osy.

Nahlásit jako SPAM
IP: 82.208.4.–
Kubas880
Newbie
14. 11. 2012   #5
-
0
-

děkuji za přechozí odpovědi

Začal jsem nějakým způsobem kodit ten program ale jsem v koncích:

používám 2 jednorozměrná statická pole: poleX pro uložení Xových souřadnic a poleY pro uložení Y souřadnic.

Mám napsané zadáváni souřadnic.Pokud zadám pro bod X souřadnici 0 a pro Y souřadnici 0 tak zadáváni bodů skončí.  Výpočet pro průsečíky už  mám na papíře vymyšlený. Teď potřebuju porovnávat jestli jsou dva po sobě jdoucí body ( ve stejných kvadrantech,pokud ano nebudou mít žádný průsečík protože se omezím na úsečku z přímky).Můžete mi poradit jak to zapíšu?

#include <stdio.h>
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
float x,y;
float poleX[5];
float poleY[5];
int pocitadlo =1;
int index = 0;
int pocitadlo2 =0;
cout << "\t Program pro vypocet pruseciku s osami"<<endl;


do
{
  cout<<"Zadejte souradnice "<<pocitadlo<<".bodu"<<endl;
  cout<<"Souradnice x: ";
  cin>>x;
  poleX[index]=x;
  cout<<"souradnice y: ";
  cin>>y;
  poleY[index]=y;
  pocitadlo++;
  index++;
}
while ((x!=0)&&(x!=0));
return 0;
}

Nahlásit jako SPAM
IP: 160.217.224.–
reciproke0
Návštěvník
14. 11. 2012   #6
-
0
-

#5 Kubas88
Když dojde k protnutí řekněme osy y, tak x-ová souřadněce prvního budu je > 0 a ta druhého musí být < 0 či obě naopak, jinak neprotíná osu y....

Nahlásit jako SPAM
IP: 82.208.4.–
Kubas880
Newbie
15. 11. 2012   #7
-
0
-

#6 reciproke
Napsal jsem si podmínky pro porovnávání na ty kvadranty :

(((poleX[i]&&poleX[i+1])>0)&&((poleY[i]&&poleY[i+1]))>0)

a takto bych napsal pro všechny 4 případy? Šlo by to tak řešit?

Nahlásit jako SPAM
IP: 160.217.224.–
reciproke0
Návštěvník
15. 11. 2012   #8
-
0
-

#7 Kubas88
Ještě si nejsem jistý tím polem, když nevíš kolik bodů budeš mít a obzvášť když pro výpočet ti stačí poslední a předposlední.

Protnutí os x a y musíš mít v podmínce zvlášť, tvou podmínku ponecháme stranou...
 

// Ax, Bx - x-osová souř. pro poslední a předchozí zadaný bod

if((Ax > 0 && Bx < 0) || (Ax < 0 && Bx > 0)) 
{ 
	// průnik osy Y
}
Nahlásit jako SPAM
IP: 82.208.4.–
Kubas880
Newbie
15. 11. 2012   #9
-
0
-

#8 reciproke
No dostal jsem prodloužení termínu odevzdání tohoto projektu, tak mě napadlo jestli to ještě nepředělat a zda by nebylo elegantnější udělat to přes struktury.

jeden bod = jedna struktura s parametrama x souřadnice a y souřadnice. Co si o to myslíš?

Nahlásit jako SPAM
IP: 160.217.224.–
reciproke0
Návštěvník
15. 11. 2012   #10
-
0
-

#9 Kubas88
Určitě je to logické a přehlednější řešení.

Nahlásit jako SPAM
IP: 82.208.4.–
Kubas880
Newbie
15. 11. 2012   #11
-
0
-

#10 reciproke
super díky pustim se do toho

Nahlásit jako SPAM
IP: 160.217.224.–
Kubas880
Newbie
20. 11. 2012   #12
-
0
-

#10 reciproke
Nakonec jsem to začal dělat přes 1D pole. Chtěl bych se zeptat na pár rad, jak zapsat podmínky aby, když potřebuju pracovat s floatama nebo doublema. A zda je struktura prozatím správně napsaná. 

Funckci vypocetPrusecik jsou předávány parametry postupně z poleX a z poleY v každém cyklu na základě funkce která mi porovná zda mohou mít průsečík ( ty podmínky jsem nakonec zapsal jak jsi mi radil - neporovnávám 4 kvadranty ale jen 2 abych se nedostal do problému že mi úsečka vypočte průsečík s osou i když budou ve stejném kvadrantu)

funkce kvadrant by měla sloužit jak jsem psal výše čistě jen pro porovnávání souřadnic zda jsou ve stejném kvadrantu. Nevím však jak to napsat když nechci int ale double (nebo float)

#include <stdio.h>
#include <iostream>
using namespace std;
double vypocetPrusecik(float x1,float x2,float y1, float y2)
{
float A,B,prusecik;
A = (y2-y1)/(x2-x1);
B = y2-(x2)*A;
prusecik= -B/A;
return prusecik;
}

void kvadrant(float x1, float x2, float y1, float y2)
{ //vypocet pruseciku y
if ((x1>0 && x2<0)││(x1<0 && x2>0))
  vypocetPrusecik(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);
//vypocet pruseciku x
else if ((y1 && y2)││(y1<0&& y2>0))
  vypocetPrusecik(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);
else
  cout << "Body nemaji prusecik"<<endl;
}


int main(int argc, char **argv)
{
float x,y;
float poleX[5];
float poleY[5];
//double poleKVA[4];
int pocitadlo =1;
int index = 0;

cout << "\t Program pro vypocet pruseciku s osami"<<endl;


do
{
  cout<<"Zadejte souradnice "<<pocitadlo<<".bodu"<<endl;
  cout<<"Souradnice x: ";
  cin>>x;
  poleX[index]=x;
  cout<<"souradnice y: ";
  cin>>y;
  poleY[index]=y;
  kvadrant(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);
  //cout<<"Prusecik bodu"<<pocitadlo<<"a "<< pocitadlo-1<<"je:"prusecik<<endl;
  // průnik s osou y
  pocitadlo++;
  index++;
}
while ((x!=0)&&(y!=0));


return 0;
}

Nahlásit jako SPAM
IP: 160.217.224.–
Kubas880
Newbie
20. 11. 2012   #13
-
0
-

#10 reciproke
ještě jsem předělal tu funkci na porovnávání na bool:

#include <stdio.h>
#include <iostream>
using namespace std;
float vypocetPrusecik(float x1,float x2,float y1, float y2)
{
float A,B,prusecik;
A = (y2-y1)/(x2-x1);
B = y2-(x2)*A;
prusecik= -B/A;
return prusecik;
}

bool kvadrant(float x1, float x2, float y1, float y2)
{ //vypocet pruseciku y
if ((x1>0 && x2<0)││(x1<0 && x2>0))
  return true;
//vypocet pruseciku x
else if ((y1>0 && y2<0)││(y1<0 && y2>0))
  return true;
else
  return false;
}


int main(int argc, char **argv)
{
float x,y;
float poleX[5];
float poleY[5];
//double poleKVA[4];
int pocitadlo =1;
int index = 0;

cout << "\t Program pro vypocet pruseciku s osami"<<endl;


do
{
  cout<<"Zadejte souradnice "<<pocitadlo<<".bodu"<<endl;
  cout<<"Souradnice x: ";
  cin>>x;
  poleX[index]=x;
  cout<<"souradnice y: ";
  cin>>y;
  poleY[index]=y;
  kvadrant(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);
  if (kvadrant == true)
  {
   cout<<vypocetPrusecik(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);
  }
  else
  {
   cout<<"body nemaji prusecik";
  }

  // průnik s osou y
  pocitadlo++;
  index++;
}
while ((x!=0)&&(y!=0));


return 0;
}

Nahlásit jako SPAM
IP: 160.217.224.–
reciproke0
Návštěvník
21. 11. 2012   #14
-
0
-

#13 Kubas88

 Co se týká porovnání floatů, to by tě trápit podle mě nemělo protože porovnáváš < a >. Mimo to příklad neukazuje že by se zadávalo něco jiného než celá čísla, float potřebuješ až u výpočtů směrnice.

Tohle je z principu nelogické, zjistil jsi že je průsečík s určitou osou a hned ho musíš vypočítat, jako v tvé předchozí verzi. Pokud si pouze zjistíš že k nějakému došlo pak by jsi musel vypočítat průsečíky přímky s osami a následně znovu kontrolovat zda leží na tvé úsečce.

bool kvadrant(float x1, float x2, float y1, float y2)
 { //vypocet pruseciku y
 if ((x1>0 && x2<0)││(x1<0 && x2>0))
   return true;
 //vypocet pruseciku x
 else if ((y1>0 && y2<0)││(y1<0 && y2>0))
   return true;
 else
   return false;
 }
Nahlásit jako SPAM
IP: 147.32.218.–
reciproke0
Návštěvník
21. 11. 2012   #15
-
0
-
Nahlásit jako SPAM
IP: 147.32.218.–
Kubas880
Newbie
21. 11. 2012   #16
-
0
-

#15 reciproke
ne tak není problém v porovnávání floatů, když jsem to přepsal do integerů tak mám stejný problém.

Nahlásit jako SPAM
IP: 160.217.224.–
reciproke0
Návštěvník
21. 11. 2012   #17
-
0
-

#16 Kubas88
a ten problém je jaký?  Jediné co vidím je následující podmínka, proměnná kvadrant neexistuje... výstup z funkce kvadrant() si ani nikam neukládáš. Mimo to že jsi zjistil průsečík s konkrétní osou jak jsem naznačil, by jsi měl spíše řešit v té funkci.



 kvadrant(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);
   if (kvadrant == true)
   {
    cout<<vypocetPrusecik(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);
   }
Nahlásit jako SPAM
IP: 82.208.4.–
Kubas880
Newbie
21. 11. 2012   #18
-
0
-

#17 reciproke
ten výpočet by měl být podle mě dobře, počítali jsme to takto X krát a vycházelo to.Základ jsem bral z webu :http://www.matweb.cz/primka Ta podmínka (tam jsem chtěl porovnávat ne proměnnou  kvadrant ale zda je funkce bool == true. Pokud ano zavlá se funkce pro výpočet průsečíku.

Nahlásit jako SPAM
IP: 160.217.136.–
reciproke0
Návštěvník
21. 11. 2012   #19
-
0
-

Tak snad v tom případě takhle ne? 

if (kvadrant(poleX[index],poleX[index-1],poleY[index],poleY[index-1]) == true)
{
    cout<<vypocetPrusecik(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);
}

A pokud to chceš takhle používat... potom stejně musíš kontrolovat zda průnik konkrétní osy je na tvé úsečce a to v té funkci resp. v odpovídajících podmínkách víš.

Nahlásit jako SPAM
IP: 82.208.4.–
Kubas880
Newbie
21. 11. 2012   #20
-
0
-

Ještě jsem rozdělil zvlášť ty podmínky porovnávánm zvlášť zda je průsečík s osou X a s osou Y

bool osaY(int x1, int x2)
{
//vypocet pruseciku y
if (x1>0 && x2<0)
  return true;
else if (x1<0 && x2>0)
  return true;
else
  return false;
}

bool osaX(int y1, int y2)
{
//vypocet pruseciku X

 
if (y1>0 && y2<0)
  return true;
else if(y1<0 && y2>0)
  return true;
else
  return false;
}

a zde jdou pak podmínky pro volání funkce pro výpočet průsečíků

if(osaY(poleX[index],poleX[index-1]) == true)
   cout<<vypocetPrusecik(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);


  else if (osaX(poleY[index],poleY[index-1])==true)
   cout<<vypocetPrusecik(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);


  else if ((osaX(poleY[index],poleY[index-1])==true) &&(osaY(poleY[index],poleY[index-1])==true))
   cout<<vypocetPrusecik(poleX[index],poleX[index-1],poleY[index],poleY[index-1]);


  else
   cout<<"body nemaji prusecik";

Nahlásit jako SPAM
IP: 160.217.224.–
Kubas880
Newbie
21. 11. 2012   #21
-
0
-

#19 reciproke
Nevím jestli jsem správně pochopil to jak jsi mi psal abych kontroloval průnik konkrétní osy. Pochopil jsem to správně když jsem výše uvedeným stylem předělal podmínky?

Nahlásit jako SPAM
IP: 160.217.224.–
reciproke0
Návštěvník
21. 11. 2012   #22
-
0
-

#21 Kubas88
 no nepochopil, brání ti něco tu funkci použít takhle?

void kvadrant(float x1, float x2, float y1, float y2)
{ 
   if ((x1>0 && x2<0)││(x1<0 && x2>0))
   {
       //vypocet pruseciku osy y => do rovnice přímky dosaď x = 0
   }
   else if ((y1>0 && y2<0)││(y1<0 && y2>0))
   {
       //vypocet pruseciku osy x => do rovnice přímky dosaď y = 0
   }
}
Nahlásit jako SPAM
IP: 82.208.4.–
reciproke0
Návštěvník
21. 11. 2012   #23
-
0
-

#21 Kubas88
jsem zapoměl ty nepočítáš rovnici, ale rovnou průsečík osy. Tvá funkce vypocetPrusecik() počítá průnik osy X, takže si zaloláš jen tu a do druhé podmínky si tu funkci vyjádři pro průnik Y.

Nahlásit jako SPAM
IP: 82.208.4.–
Kubas880
Newbie
21. 11. 2012   #24
-
0
-

#22 reciproke
no a pokud bude splněná podmínka tak zavolám funkci s výpočtem... ano? Omlvouvám se, že nechápu ale programuju teprve nějaký týden.

Nahlásit jako SPAM
IP: 160.217.224.–
reciproke0
Návštěvník
21. 11. 2012   #25
-
0
-

#24 Kubas88
ano, podmínka bude splněná při průniku dané úsečky a osy, pak zavoláš vápočet pro příslušnou osu.

Nahlásit jako SPAM
IP: 82.208.4.–
Kubas880
Newbie
21. 11. 2012   #26
-
0
-

#25 reciproke
pro Y by tedy měla být vvolaná funkce:

int vypocetPrusecikY(int x1,int x2,int y1,int y2)

{

//vrací průsečík Y
int A,prusecikY;
A = (y2-y1)/(x2-x1);
prusecikY = y2-(x2)*

}

?

Nahlásit jako SPAM
IP: 160.217.224.–
reciproke0
Návštěvník
21. 11. 2012   #27
-
0
-

#26 Kubas88
něco ti tam vypadlo. Je to prakticky jen záměna souřadnic x a y. Takže buď si napíšeš zvláštní funkci i na osu Y nebo můžeš použít tu samou. Ale budeš volat tak jí předáš opačně ty souřadnice.

Nahlásit jako SPAM
IP: 82.208.4.–
Kubas880
Newbie
21. 11. 2012   #28
-
0
-

#27 reciproke
Prosímtě mohli by jsme komunikovat soukromě,Např pomocí Facebooku či něčeho takového?Dozvěděl jsem se že mi pár lidí nahlíží do vlákna a nemám zájem o duplikaci kterou byl u nás problém v minulém zadání úkolu.

díky

Nahlásit jako SPAM
IP: 160.217.224.–
reciproke0
Návštěvník
21. 11. 2012   #29
-
0
-

#28 Kubas88
No najít si mě můžeš...

Nadruhou stranu se připravíš o spoustu dalších názorů. A myslím že když máš konkrétní problém a dodáš jen potřebný kontext, tak není možné že by někdo kompletně duplikoval.

Nahlásit jako SPAM
IP: 82.208.4.–
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, 34 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ý