Dlzka konvexneho obalu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dlzka konvexneho obalu – C / C++ – Fórum – Programujte.comDlzka konvexneho obalu – C / C++ – Fórum – Programujte.com

 

Adam K.
~ Anonymní uživatel
4 příspěvky
13. 12. 2016   #1
-
0
-

Ahojte snazim sa nakodit program na vypocet dlzky konvexneho obalu ale nie a nie to dokoncit :( Uz mi to leze na nervy -_-. Ak niekomu z vas chce tak skuste na to mrknut a ked tak hodit nejaku radu ako to dokoncit :)

moj kodik:

// uloha-9-2.c -- Tyzden 9 - Uloha 2
// Adam Kotvas, 16.11.2016 12:11:42

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct bod
{
	double x;
	double y;
}BOD,VEKTOR;

BOD b[1000];
VEKTOR normal;
int n;

int poloha_bodu(int i, VEKTOR ab, double c) {
	double x, y,vysledok;
	y = b[i].y;
	x = normal.x*b[i].x;
	vysledok = -(x + c) / normal.y;
	if (y>vysledok) return 1;
	if (y == vysledok) return 0;
	else
		return -1;


}

int vektorovy_sucin(VEKTOR v,VEKTOR v2)
{
	double sucin;

	sucin = v2.x*v.y - v2.y*v.x;

	if (sucin == abs(sucin)) return 1;
	else
		return -1;


}

double dlzka_vektora(VEKTOR v)
{
	return sqrt(pow(v.x, 2) + pow(v.y, 2));
	
}

int porovnaj_body(const void *p1, const void *p2)
{
	const BOD *pt1 = p1;
	const BOD *pt2 = p2;

	// do primary compare on x
	if (pt1->x > pt2->x)
		return 1;
	if (pt1->x < pt2->x)
		return -1;

	// pt1->x == pt2->x - do secondary compare on y...
	if (pt1->y > pt2->y)
		return 1;
	if (pt1->y < pt2->y)
		return -1;

	// pt1 == pt2
	return 0;
}

int main()
{
	int i,poloha,hore[1000],dole[1000],h=0,d=0;
	scanf("%d", &n);
	if (n <= 0 && n > 1000) return 0;
	for (i = 0; i < n; i++)
	{
		scanf("%lf %lf", &b[i].x, &b[i].y);
	}
	qsort(b, n, sizeof(BOD), porovnaj_body);

	//rozdelenie na polku
	VEKTOR ab;
	double c;
	ab.x = b[n - 1].x - b[0].x;
	ab.y = b[n - 1].y - b[0].y;
	normal.x = -ab.y;
	normal.y = ab.x;
	c = -normal.x*b[0].x - (normal.y*b[0].y);
	for (i = 0; i < n; i++)
	{
		poloha = poloha_bodu(i,ab,c);
		if (poloha == 1) hore[h++] = i;
		if (poloha == -1) dole[d++]=i;
		if (poloha == 0)
		{
			hore[h++] = i;
			dole[d++] = i;
		}

	}
	int j = 0;
	double v, dlzka = 0;
	VEKTOR v1, v2, v3;
	//dolna polka
	for (i = 0; ; i++)
	{
		int in=0;
		if (d <= 2) break;
		if (dole[i + 2] <= 0)
		{
			v1.x = b[dole[i + 1]].x - b[dole[i]].x;
			v1.y = b[dole[i + 1]].y - b[dole[i]].y;
			dlzka+=dlzka_vektora(v1);
			printf("dlzka je %f\n", dlzka);
			break;
		}
		v1.x = b[dole[i+1]].x - b[dole[i]].x;
		v1.y = b[dole[i+1]].y - b[dole[i]].y;

		v2.x = b[dole[i+2]].x - b[dole[i]].x;
		v2.y = b[dole[i + 2]].y - b[dole[i]].y;
		in=vektorovy_sucin(v1, v2);
		if (in == -1)
		{
			v3 = v2;
			dlzka += dlzka_vektora(v1);
			printf("dlzka je %f\n", dlzka);
			continue;
		}
		if (in == 1)
		{
			//if (dlzka == 0)
			continue;
			//dlzka-= dlzka_vektora(v1);
			printf("dlzka je %f\n", dlzka);
			//dlzka += dlzka_vektora(v3);
			printf("dlzka je %f\n", dlzka);

		}

	}
	//horna polka
	for (i = 0; ; i++)
	{
		int in = 0;
		if (h <= 2) break;
		if (hore[i + 2] <= 0)
		{
			v1.x = b[hore[i + 1]].x - b[hore[i]].x;
			v1.y = b[hore[i + 1]].y - b[hore[i]].y;
			dlzka += dlzka_vektora(v1);
			printf("dlzka je %f\n", dlzka);
			break;
		}
		v1.x = b[hore[i + 1]].x - b[hore[i]].x;
		v1.y = b[hore[i + 1]].y - b[hore[i]].y;

		v2.x = b[hore[i + 2]].x - b[hore[i]].x;
		v2.y = b[hore[i + 2]].y - b[hore[i]].y;
		in = vektorovy_sucin(v1, v2);
		if (in == 1)
		{
			v3 = v2;
			dlzka += dlzka_vektora(v1);
			printf("dlzka je %f\n", dlzka);
			continue;
		}
		if (in == -1)
		{
			if (dlzka == 0)continue;
			dlzka -= dlzka_vektora(v1);
			printf("dlzka je %f\n", dlzka);
			dlzka += dlzka_vektora(v3);
			printf("dlzka je %f\n", dlzka);

		}

	}

	printf("%.3lf", dlzka);

	return 0;
}


ta posledna cast je totalny bordel ja viem :D

Dakujem vopred ak sa niekto odhodla :)

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

Podobná vlákna

Dlzka prihlasenia v phpmyadmin — založil marioff

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ý