что не так с моим кодом 2D интерполяции C - PullRequest
1 голос
/ 13 марта 2011
#include <GL/glut.h>
#include <GL/gl.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 200
typedef struct vertex{

    float x;                  //  x position of the point
    float y;                  //  y position of the point
    float r;                  //  red color component of the point
    float g;                  //  green color component of the point
    float b;                  //  blue color component of the point
    char isVisited;
}Vertex;

Vertex *borderLines,*interPolationLines;
int vertex_Count;// total vertex
int counter;//counts matched y coordinates 
FILE *f,*g;

void readTotalVertexCount(){

    if((f = fopen("vertex.txt","r"))==NULL){
        printf("File could not been read\n");
        return ;
    }
    fscanf(f,"%d",&vertex_Count);

    /*if((g = fopen("points.txt","w"))==NULL){

        return ;
    }*/
}

void readVertexCoordinatesFromFile(){

    Vertex v[vertex_Count];
    borderLines = (Vertex *)calloc(N*vertex_Count,sizeof(Vertex));
    interPolationLines = (Vertex *)calloc(N*N*(vertex_Count-1),sizeof(Vertex));

    int i = 0;int j;
    //read vertexes from file
    while(i<vertex_Count){
        fscanf(f,"%f",&(v[i].x));
        fscanf(f,"%f",&(v[i].y));
        fscanf(f,"%f",&(v[i].r));
        fscanf(f,"%f",&(v[i].g));
        fscanf(f,"%f",&(v[i].b));
        //printf("%f %f \n",v[i].x,v[i].y);  
        i++;
    }

    Vertex *borderLine,*temp;
    float k,landa;

    // draw border line actually I am doing 1D Interpolation with coordinates of my vertexes
    for (i = 0;i < vertex_Count;i++){
        int m = i+1;
        if(m==vertex_Count)
            m = 0;

        borderLine = borderLines + i*N;

        for(j = 0;j < N; j++){
            k = (float)j/(N - 1);
            temp = borderLine + j;
            landa = 1-k;
            //finding 1D interpolation coord. actually they are borders of my convex polygon 
            temp->x = v[i].x*landa + v[m].x*k;
            temp->y = v[i].y*landa + v[m].y*k;
            temp->r = v[i].r*landa + v[m].r*k;
            temp->g = v[i].g*landa + v[m].g*k;
            temp->b = v[i].b*landa + v[m].b*k;
            temp->isVisited = 'n'; // I didn't visit this point yet
            //fprintf(g,"%f %f %f %f %f\n",temp->x,temp->y,temp->r,temp->g,temp->b);
        }
    }
    /* here is actual place I am doing 2D Interpolation
       I am traversing along the border of the convex polygon and finding the points have the same y coordinates
       Between those two points have same y coord. I am doing 1D Interpolation*/
    int a;counter = 0;
    Vertex *searcherBorder,*wantedBorder,*interPolationLine;
    int start = N*(vertex_Count);   int finish = N*vertex_Count;

    for(i = 0;i< start ;i++){

        searcherBorder = i + borderLines;

        for(j = i - i%N + N +1; j< finish; j++){

            wantedBorder = j + borderLines;
            if((searcherBorder->y)==(wantedBorder->y) && searcherBorder->isVisited=='n' && wantedBorder->isVisited=='n'){
                //these points have been visited                                            
                searcherBorder->isVisited = 'y';
                wantedBorder->isVisited = 'y';

                interPolationLine = interPolationLines + counter*N;
                //counter variable counts the points have same y coordinates.
                counter++;
                //printf("%d %d %d\n",i,j,counter);
                //same as 1D ınterpolation     
                for(a= 0;a< N;a++){

                    k = (float)a/(N - 1);
                    temp = interPolationLine + a;
                    landa = 1-k;
                    temp->x = (wantedBorder->x)*landa + (searcherBorder->x)*k;
                    temp->y = (wantedBorder->y)*landa + (searcherBorder->y)*k;
                    temp->r = (wantedBorder->r)*landa + (searcherBorder->r)*k;
                    temp->g = (wantedBorder->g)*landa + (searcherBorder->g)*k;
                    /*if(temp->x==temp->y)
                        printf("%f  %f \n",wantedBorder->x,searcherBorder->x);*/
                    temp->b = (wantedBorder->b)*landa + (searcherBorder->b)*k;

                }
            }
        }
    }

    fclose(f);
}

void display(void){

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0,1.0,1.0);

    int i,j;
    Vertex *interPol,*temp;

    glBegin (GL_POINTS);

    for(i = 0;i< counter;i++){
        interPol = interPolationLines + i*N;
        for(j = 0;j< N;j++){
            temp = interPol + j;
            glColor3f((temp)->r,(temp)->g,(temp)->b);
            //fprintf(g,"%f %f \n",(temp)->x,(temp)->y);
            glVertex2f ((temp)->x,(temp)->y);
        }
    }
    //printf("%d\n",counter);
    fclose(g);
    glEnd ();
    glFlush();
}

void init(void){
    glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE);
    glutInitWindowSize(900,500);
    glutInitWindowPosition(200,100);
    glutCreateWindow("2D InterPolation");
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glShadeModel(GL_SMOOTH);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);  
}

int main(int argc, char** argv)
{
    readTotalVertexCount();
    readVertexCoordinatesFromFile();
    glutInit(&argc,argv);
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

Я реализую 2D-интерполяцию выпуклого многоугольника, и мой код не заботится о коде concav.my, который работает для некоторых выпуклых многоугольников, но для других - нет. Для тех, у кого мой код терпит неудачу, он не рисует середину многоугольника.он только рисует верхний и нижний треугольник. Он читает вершины из файла vertex.txt и его формата: x co, y co, красный, зеленый, синий цвет, информация об этой точке, как показано ниже, и для значений ниже моего кода сбой. Спасибо заОтветы заранее. Я разозлюсь.

7
0.9 0.4 1.0 0.0 1.0
0.8 0.2 1.0 0.0 1.0
0.5 0.1 1.0 0.0 0.0
0.3 0.3 0.0 0.0 1.0
0.3 0.35 0.0 0.0 1.0
0.4 0.4 0.0 1.0 0.0
0.6 0.5 1.0 1.0 1.0

1 Ответ

1 голос
/ 13 марта 2011

Без полной отладки вашей программы, я с подозрением отношусь к строке с надписью for(j = i - i%N + N +1; j< finish; j++){. Я не знаю точно, что вы собираетесь делать, но это выглядит подозрительно. Кроме того, я бы порекомендовал другой алгоритм:

  1. Обводка вокруг многоугольника
  2. Отметьте все ребра, которые охватывают желаемое значение y
  3. За исключением угловых случаев, есть только решение, если вы найдете ровно два попадания.
  4. Рассчитать пересечение ребер со значением y
  5. Выполнить X-интерполяцию

Кроме того, краткие вопросы лучше, чем "Почему моя программа не работает?" Простите, но это похоже на проблему с домашним заданием.

Примечание: Должен ли это быть комментарий, а не ответ? Я здесь новенький ...

...