Centro de circunferencia por tres puntos

Ver el tema anterior Ver el tema siguiente Ir abajo

Centro de circunferencia por tres puntos

Mensaje por [GX] el Jue Dic 01, 2016 3:40 pm

Dejo esto por acá recién hoy lo hice, está escrito en C y tenía que hacerlo en LUA:

Código:


#include<stdio.h>

typedef struct coord{
    float x;
    float y;
} coord;

void mostrar(float *v, int filas, int colmn){
    int i;
    for(i = 0; i < filas * colmn; i++){
        if(i % colmn == 0){
            printf("\n\n");
        }
        printf("%5.2f ", *(v + i));
    }
}

//Resuelve la matriz y guarda los valores en 'sol'
void matrixS(float cir3x4[][4], const int filas, const int columnas, float sol[]){
    int fila, columna, i;
    float m2x3[2][3];
    float m1x2[2];

    for(i = 0; i < 2; i++){
        for(fila = 1; fila < filas - i; fila++){
            for(columna = 1; columna < columnas - i; columna++){
                if(i == 0){
                    m2x3[fila - 1][columna - 1] = cir3x4[0][0] * cir3x4[fila][columna] - cir3x4[0][columna] * cir3x4[fila][0];
                }else{
                    m1x2[columna - 1] = m2x3[0][0] * m2x3[fila][columna] - m2x3[0][columna] * m2x3[fila][0];
                }
            }
        }
    }

    //G 1x2
    sol[2] = m1x2[1] / m1x2[0];

    //F 2x3
    for(i = 0; i < 2; i++){
        if(m2x3[i][0] != 0){
            sol[1] = ( m2x3[i][2] - sol[2] * m2x3[i][1] ) / m2x3[i][0];
            break;
        }
    }

    //E 3x4
    for(i = 0; i < 3; i++){
        if(cir3x4[i][0] != 0){
            sol[0] = ( cir3x4[i][3] - sol[2] - sol[1] * cir3x4[i][1] ) / cir3x4[i][0];
            break;
        }
    }
}

//Revisa que la primera fila no tenga 0 como primer valor
//Si lo tiene cambia la fila por otra
int validar(float v[][2]){
    int i, j, aux;
    int pasa = 1;

    if(v[0][0] == 0){
        for(i = 1; i < 3; i++){
            if(v[i][0] != 0){
                for(j = 0; j < 2; j++){
                    aux = v[0][j];
                    v[0][j] = v[i][j];
                    v[i][j] = aux;
                }
                return 1;
            }
        }
        pasa = 0;
    }

    return pasa;
}

//Toma los puntos y crea la matriz
// E  F  G  | T. ind
//---------------
// x  y  1  | -x^2 - y^2
// x1 y1 1  | -x^2 - y^2
// x2 y2 1  | -x^2 - y^2
void crearMtx(float v[][4], float puntos[][2]){
    int i, j;

    for(i = 0; i < 3; i++){
        for(j = 0; j < 4; j++){
            if(j == 2){
                v[i][j] = 1;
            }else{
                if(j == 3){
                    v[i][j] = -puntos[i][0] * puntos[i][0] - puntos[i][1] * puntos[i][1];
                }else{
                    v[i][j] = puntos[i][j];
                }
            }
        }
    }
}

//Recibe una matriz con los 3 puntos y devuelve el centro de CF
coord centroCF(float m3x2[][2]){
    int i;
    float m3x4[3][4];
    float m1x3[3];
    coord c;

    if(validar(m3x2)){
        crearMtx(m3x4, m3x2);
        matrixS(m3x4, 3, 4, m1x3);

        c.x = -m1x3[0] / 2;
        c.y = -m1x3[1] / 2;
    }else{
        printf("No pueden ser todos x = 0 \n\n");
    }
    return c;
}

void main(){
    float v[3][2] = { { 1,3},
                      {-2,0},
                      { 4,0}
    };
    coord centro;
    centro = centroCF(v);

    printf("x: %.2f y: %.2f\n", centro.x, centro.y);
}

 

[GX]

Mensajes : 34
Fecha de inscripción : 04/06/2014
Localización : Argentina

Ver perfil de usuario https://osu.ppy.sh/u/Bubblesss

Volver arriba Ir abajo

Re: Centro de circunferencia por tres puntos

Mensaje por [FS] Frost el Sáb Dic 17, 2016 8:18 pm

Genial. Smile

¿Pudiste llamar código en C desde LUA?

[FS] Frost
Admin

Mensajes : 15
Fecha de inscripción : 03/06/2014
Edad : 23
Localización : Antártica chilena (?)

Ver perfil de usuario http://www.syncrajo.net/

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.
Crear foro con ForoActivo | © phpBB | Foro gratis de asistencia | Contactar | Denunciar un abuso | foro gratis