我的 2D 插值 C 代码有什么问题

发布于 2024-10-21 19:15:29 字数 5947 浏览 8 评论 0原文

#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 插值,我的代码不关心凹多边形。我的代码适用于某些凸多边形,但对于其他多边形则失败。对于那些失败的代码,它不会绘制多边形的中间。它只绘制上部和上部下三角形。它从文件 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
#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;
}

I am implementing 2D Interpolation of a convex polygon and my code does not care about concav.my code works for some convex polygons but for others fail.For those my code fails it does not draw middle of the polygon.it only draws an upper and lower triangle.it reads vertexes from file vertex.txt and its format:x co,y co,red,green,blue color info of that point like below and for the values below my code fails.Thanks for replies in advance.I will get mad.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

香草可樂 2024-10-28 19:15:29

在没有完全调试您的程序的情况下,我对 for(j = i - i%N + N +1; j< finish; j++){ 行表示怀疑。我不知道你到底想做什么,但看起来很可疑。此外,我会推荐一种不同的算法:

  1. 围绕多边形
  2. 追踪 标记跨越所需 y 值的任何边 撇开
  3. 极端情况不谈,如果您正好找到两次命中,则只有一个解决方案。
  4. 计算边与 y 值的交集
  5. 执行 x 插值

另外,简洁的问题比“为什么我的程序不起作用?”要好。请原谅我,但这感觉像是一个家庭作业问题。

注意:这应该是评论而不是答案吗?我是新来的...

Without fully debugging your program, I'm suspicious of the line that says, for(j = i - i%N + N +1; j< finish; j++){. I don't know exactly what you're intending to do, but it just looks suspicious. Furthermore, I would recommend a different algorithm:

  1. Trace around the polygon
  2. Mark any edges that span the desired y-value
  3. Corner cases aside, there's only a solution if you find exactly two hits.
  4. Calculate the intersection of the edges with the y-value
  5. Perform the x-interpolation

Also, concise questions are better than, "Why doesn't my program work?" Forgive me but it feels like a homework problem.

Note: Should this be a comment instead of an answer? I'm new here...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文