Ir ao conteúdo

Distancia euclidiana


RogerGalvao

Posts recomendados

Postado

Bom galera e o seguinte preciso calcular a distancia entre pontos dados por vertices (x,y)

ai eu pensei em fazer isso

#include <stdio.h>
#include <math.h>
void dist(int x1, int x0,int y1,int y0) {
sqrt((x1-x0)^2+(y1-y0)^2);
}

int main() {

int x1;
int x0;
int y1;
int y0;

scanf ("%d %d %d %d",&x1,&x0,&y1,&y0);
printf ("%f",dist);

}

Só que o problema é que fica dando 0.000 , e tipo os valores dos vertices sao sempre numeros inteiros.

Ai o exercicio pede pra calcular a distancia entre N pares de vertices e calcular o perimetro deles alguem tem ideia?

Postado

você não iniciou corretamente a função.. deveria ser


printf("%f", dist(x1, x0, y1, y0));

só isso XD

quanto a outra pergunta, tem como transcrever a questão? ou colocar algum exemplo? =S

Postado

Observe que o perímetro é composto pela soma das distâncias euclidianas entre as arestas formadas pelas coordenadas do polígono. Lembre-se de que aqui um polígono começa e termina com o primeiro par de coordenadas. Além disso, como os gregos só consideram números inteiros, não se esqueça de arredondar o número obtido em cada distância euclidiana para baixo (para isso basta fazer um cast, por exemplo).

Tipo assim ele vai dar N pares de vertices (x,y) que formam um poligono e preciso calcular o perimetro desse poligono ,tendo sempre que arrendondar as distancias euclidianas para menos

Obs: so pode usar biblioteca math.h stdio.h e desvios condicionais (if, else, switch) e comandos de laço (for, while);

E onde tenho que colocar esse printf que voce colocou, e so substituir o meu?

Postado

#include <stdio.h>
#include <math.h>

typedef struct point{
double X;
double Y;
} Point;

double distance(Point p1, Point p2)
{
return sqrt( pow(p1.X - p2.X, 2) + pow(p1.Y - p2.Y, 2) );
}

int main (int argc, char *argv[])
{
Point p1, p2;

p1.X = 4; p1.Y = 0;
p2.X = 0; p2.Y = 3;

printf("%lf", distance(p1, p2));

getchar();
return 0;
}

primeiro criei uma estrutura para representar um ponto, depois criei 2 ponto p1 e p2, iniciei os valores, e pegue o resultado.

lembrando que o operador ^ NÃO SERVE para potenciacão, significa "OU EXCLUSIVO", para potenciação use o método pow)

x | y | x^y

0 | 0 | 0

0 | 1 | 1

1 | 0 | 1

1 | 1 | 0

Postado

sim, só substituir no seu.. :)

quanto ao programa do bróder, não posso falar nada.. não sei usar struct e não entendi como iria colocar novos valores (até porque, não sei nada de struct ...ainda XD)

Postado

mais matheus como faço , quando tipo ele der 20 pares de vertices , pra eu calcular o perimetro do poligono?

Obs: Não vou poder usar a estrututa do matheus pois nao foi algo que ja aprendi em sala, o que posso fazer na minha estrutura pra corrigir

Postado

pronto, use com vetores.. assimile cada um deles

ex: float x[100], y[100];

quando for chamar cada par você coloca em relação..

ex:


for(i=0; i<100; i++)
{
printf("Digite o par x,y: ");
scanf("%f %f", &x[i], &y[i]);
}

acho que isso ajuda ;)

Postado

então tipo o numero N de pares de vertices varia entre 2 e 5000 2<N<5000

tipo assim se ele der 4 pares de vertices por exemplo (0,0) (10,0) (10,10) (0,10) o perimetro da figura é 40 , mas como faço isso


#include <stdio.h>
#include <math.h>

main ()
{
int x0,y0;
int x1,y1;
float d;

scanf ("%d %d", &x0,&y0);
scanf ("%d %d", &x1,&y1);
d= sqrt(((x1-x0)*(x1-x0))+((y1-y0)*(y1-y0)));

printf ("Distancia %f\n",d);

}

Tentei essa mas nao ta dando certo também --'

Postado

acho que o melhor jeito é fazendo o seguinte..

coloque como variaveis externas

float x[5000], y[5000]; //mesmo esquema dito anteriomente

int ponto_atual=0; //sempre será aumentado ou diminuido

coloque uma função que defina até onde irá o ponto atual (quantos pares deseja colocar)

e coloque um dist_soma como int (a soma será automaticamente "CASTada" e descera de um numero a soma..)

bom.. acho que isso ajuda.. se não tiver entendido eu faço alguma coisa pra servir de exemplo.. beleza? :)

Postado

Pronto, aqui o exemplo:

tem pilha (o que falei com relação a variavel externa e posição) e funções de controle (acho que seriam esses os nomes.. não sou muito bom com nomes XD)

#include <stdio.h>
#include <math.h>

float numeros[10];
int pos_atual=0;

float numero_digitado()
{
float numero;
printf("Digite um numero: ");
scanf("%f", &numero);
return numero;
}

int soma()
{
float res=0;
if(pos_atual==0)
{
printf("Erro: Nenhum numero na pilha\n");
return 0;
}
else
while(pos_atual>0)
{
res+=numeros[--pos_atual];
}
printf("Soma: %f", res);
return 1;
}

float putNumero()
{
if(pos_atual==10)
printf("Erro: Pilha cheia.. malz =/\n");
else
numeros[pos_atual++]=numero_digitado();
}

main()
{
int opcao;
do
{
printf("O que deseja fazer? \n1 - Somar\n2 - Colocar novo numero\n3 - Sair\n");
scanf("%d", &opcao);
switch(opcao)
{
case 1: soma();
break;
case 2: putNumero();
break;
case 3: break;
default: printf("Erro: Opcao nao valida\n");
}
}while(opcao!=3);
}

espero que ajude a entender o que quis dizer ;)

Postado

vou te mandar uma mp pra você dar uma olhada no exercicio completo

O que eu quero fazer basicamente é o seguinte dados 4 pontos

x1 = (0,0)

x2 = (10,0)

x3 = (10,10)

x4 = (0,10)

Calcular o perimetro de x2-x1 + x3-x2 + x4-x3 + x0-x4

porque o poligono sempre começa e termina no ponto x0, nesse caso seria um quadrado mas eu tenho que fazer isso para N pontos que formam diferentes poligonos

Postado

cara, primeiro é BEM BOM que você coloque o link por aqui também... caso mas alguem pense em te ajudar você deveria ter colocado o que está nos crterios importantes... nem o exemplo que eu te falei parece casar com a situação (por conter pilhas e matrizes...)

como só pode int, condicionais e comandos de laço.. diria que deve ser feito assim

declare as variaveis (apenas com int, lembre-se) coloque uma pergunta de quantos n pontos irão ser colocados... e já va somando

ex:


printf("Quantos produtos irão ser comprados: ");
scanf("%d", &qntd);
while(qntd>0)
{
printf("Digite o valor do produto: ");
scanf("%d", &valor);
soma+=valor;
qntd--;
}

acho que isso já ajuda a começar uma parte :D

ps: se você souber usar isso que falei você já vai estar a meio caminho andado acho.. XD

Postado

#include <stdio.h>
#include <math.h>

typedef struct point{
double X;
double Y;
} Point;

double distance(Point p1, Point p2)
{
return sqrt( pow(p1.X - p2.X, 2) + pow(p1.Y - p2.Y, 2) );
}

double perimetro(Point *points, int numberOfPoints)
{
double result = 0;

for (int i = 0; i < numberOfPoints; i++)
{
result += distance(points[i], points[(i + 1) % numberOfPoints]);
}

return result;
}

int main (int argc, char *argv[])
{
Point p1, p2, p3, p4;

p1.X = 0; p1.Y = 0;
p2.X = 0; p2.Y = 10;
p3.X = 10; p3.Y = 10;
p4.X = 10; p4.Y = 0;

Point points[4];
points[0] = p1;
points[1] = p2;
points[2] = p3;
points[3] = p4;


printf("%lf", perimetro(points, 4));

getchar();
return 0;
}

ta ae, como calculei o perímetro, basicamente é assim, o valor passado será o ponteiro do vetor e a quantidade de pontos, o for percorre calculando

p1-> p2 + p2 ->p3 + p3-> p4 + p4 -> p1(chegamos no p1 com o resto da divisão por numeroDePontos).

Postado

Entendi a sua ideia matheus , tipo nesse codigo aqui que fiz pra calcular a distancia entre dois pontos



#include <stdio.h>
#include <math.h>


main ()
{
int x0,y0;
int x1,y1;
float d;

scanf ("%d %d %d %d", &x0,&y0,&x1,&y1);

dist = sqrt(((x1-x0)*(x1-x0))+((y1-y0)*(y1-y0)));

printf ("Distancia %f\n",d);

}

Acho que o certo seria eu usar uma variavel aux pra calcular as distancias ne, porque tipo

P1(x0,y0)

P2(x1,y1)

Ai depois vem P3 P4 PN , ai ia usando aux pra apagar o x0,y0 e tornar o x1,y1 como x0,y0 nao é?

Bom o problema ja foi resolvido

Gostaria de agradecer a Matheus Maldi pela ajuda na resolução do problema e pela paciencia em ajudar

  • Moderador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...