Najdi průsečík – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Najdi průsečík – C / C++ – Fórum – Programujte.comNajdi průsečík – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Laura a Naty
~ Anonymní uživatel
5 příspěvků
19. 3. 2014   #1
-
0
-

Ahoj máme problém s dokončením tohoto kodu   nemůžeme vymyslet jak  udělat aby nám to našlo průsečíky kdyby jste nám prosíme někdo poradil ? :)

#include "stdafx.h"

#define _CRT_SECURE_NO_DEPRECATE /* nefunguje, musi se pridat polozka _CRT_SECURE_NO_DEPRECATE do
                                    project prperties / C/C++  / preprocessor / do prvniho radku*/

#include<stdio.h>
#include<atlalloc.h>

/*
- otevri soubor libovolneho jmeno
- zjisti pocet radku
- alokuj pamet na 4*sizeof(int)*pocet_radku
- napln pamet daty ze souboru
*/
struct bod        { int x; int y; };
struct usecka    { bod a; bod b; };

usecka *nactiUseckyZeSouboru(char *nazevSouboru)
{
    usecka *u;
    FILE *zdroj;
    int radku, i;            // pocet radku v souboru
    int ax, ay, bx, by;

    // otevri soubor
    zdroj = fopen(nazevSouboru, "r+t");
    if (zdroj == NULL)
        return(NULL);
    char c;
    radku = 0;
    // zjisti pocet radku
    while (!feof(zdroj))  {
        c = fgetc(zdroj);
        if (c == '\n')
            ++radku;
    }
    // alokuj prostor na usecky
    u = (usecka *) malloc( radku*sizeof(usecka));
    // precti a zapis usecky
    fseek(zdroj, 0, SEEK_SET);            // jdi na zacatek souboru
    char radek[100];
    i = 0;        // citac radku
    while (!feof(zdroj))  {
        fgets(radek, 100, zdroj);                // nacti dalsi radek zed souboru do pripraveneho pole znaku
        sscanf(radek, "%c%d%c%d%c%c%c%d%c%d%c", &c, &ax, &c, &ay, &c, &c, &c, &bx, &c, &by);    // extrauj cisla z pole
        (u + i)->a.x = ax;
        (u + i)->a.y = ay;
        (u + i)->b.x = bx;
        (u + i)->b.y = by;
        ++i;
    }
    // zavri soubor
    fclose(zdroj);
    // vrat adresu pole usecek
    return u;
}
int main(int argc, char* argv[])
{
    usecka *u;

    u = nactiUseckyZeSouboru("c:\\soubory\\zdroj.txt");

    return 2;

    FILE *zdroj, *cil;
    int i, x, y;

    zdroj = fopen("c:\\soubory\\zdroj.txt", "w+t");
    if (zdroj == NULL) {
        printf("nezdarilo se mi zalozit soubor");
        return(2);
    }
    printf("Soubor byl zalozen, zapisuji data.");
    x = 10; y = 15;
    for (i = 0; i < 10; ++i) {
        printf("[%d,%d],[%d,%d]\n", x + i, y + i, x + i + 2, y + i + 3);
        fprintf(zdroj, "[%d,%d],[%d,%d]\n", x + i, y + i, x + i + 2, y + i + 3);
    }
    fseek(zdroj, 0, SEEK_SET);
        
    cil = fopen("c:\\soubory\\cil.txt", "w+t");
    while (!feof(zdroj))
        fputc(fgetc(zdroj), cil);

    fclose(zdroj);
    fclose(cil);

    getchar();
    return 0;
}

Nahlásit jako SPAM
IP: 77.95.40.–
Reklama
Reklama
hlucheucho+10
Posthunter
19. 3. 2014   #2
-
0
-

Úsečka leží na přímce. Rovnici přímky lze zapsat jako y = k * x + q. Stejná rovnice platí i pro úsečku s omezením na x z intervalu daného souřadnicemi koncových bodů úsečky. Je tedy třeba z koncových bodů určit rovnici přímky na které každá úsečka leží a najít průsečík těchto přímek. Pak určit, zda tento průsečík leží nejen na přímce, ale i na úsečce. Pokud mám dvě přímky:

y = k1 * x + q1   //první přímka
y = k2 * x + q2   //druhá přímka

Pak jejich průsečík je dán řešením této soustavy dvou rovnic o dvou neznámých. Pokud průsečík leží na úsečce AB musí jeho souřadnice kromě rovnice přímky AB splňovat i podmínku x je z intervalu <xA, xB> (otestuješ podmínkou if) a y je z intervalu <yA, yB> (není nutné testovat, pokud jsou předchozí podmínky splněny, tato třetí podmínka je splněna automaticky).

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Laura a Naty
~ Anonymní uživatel
5 příspěvků
19. 3. 2014   #3
-
0
-

#2 hlucheucho
Děkujem za příspěkev a radu , ale mi máme my to máme udělat pomocí dvou smyček.

Nahlásit jako SPAM
IP: 77.95.40.–
hlucheucho+10
Posthunter
19. 3. 2014   #4
-
0
-

ještě pozn.: pro rovnoběžné přímky bude platit k1 = k2, pokud leží na sobě tak i q1 = q2

Pokud bych měl možnost použít šablony, zřejmě bych pro uložení úseček použil vektor struktur. V takovém případě práci s alokováním paměti naprogramoval někdo za mne a já si tak usnadním práci.

Popsal jsem, jak určit průsečík dvou úseček. Intuitivně tuším, že máte hromadu úseček a máte určit průsečíky každé s každou, zde dojde na cykly (jak píšeš smyčky). Přesněji: pomocí dvou cyklů budeš vybírat z pole (nebo vektoru) úsečky a pomocí postupu, který jsem popsal určíš jejich průsečík (pokud existuje). Pro tento účel je dobré si uložit nejen koncové body úseček, ale i jejich koeficienty k a q z jejich rovnice.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
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, 68 hostů

Moderátoři diskuze

 

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