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