Anonymní profil Adam K. – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Adam K. – Programujte.comAnonymní profil Adam K. – Programujte.com

 

Příspěvky odeslané z IP adresy 147.175.153.–

Adam K.
C / C++ › Dlzka konvexneho obalu
13. 12. 2016   #214050

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 :)

 

 

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