【问题标题】:Calculating intersection of rectangles计算矩形的交点
【发布时间】:2013-10-23 18:22:16
【问题描述】:

我正在尝试创建一个程序,它为 2 个矩形接收 4 个值(xmin、ymin、xmax、ymax),然后计算由两个矩形创建的矩形的(xmin、ymin、xmax、ymax)。基本上我唯一遇到问题的部分是交叉部分。

编辑:澄清一下,它给了我一个答案,这不是正确的答案。冲入 1 1 4 4 和 2 2 5 5 给我 (1,1) (5,5),而不是我应该得到的 (2,2) (4,4)。

#include <stdio.h>
#include <stdlib.h>

int readRect(int *xmin, int *ymin, int *xmax, int *ymax);
int maxInt(int *val1, int *val2);
int minInt(int *val1, int *val2);

int main(){
int x = 0;
int y = 0;
int a,b,c,d;
int xmin1, ymin1, xmax1, ymax1;
int xmin2, ymin2, xmax2, ymax2;


for(;;){
printf(">>enter two rectangles:\n");
x = readRect(&xmin1, &ymin1, &xmax1, &ymax1);
y = readRect(&xmin2, &ymin2, &xmax2, &ymax2);
    if (y == x){
        if (x != 4){
            break;
        }else {
            printf("Rectangle 1: (%d, %d) (%d, %d)\n", xmin1, ymin1, xmax1, ymax1);
            printf("Rectangle 2: (%d, %d) (%d, %d)\n", xmin2, ymin2, xmax2, ymax2);
        }
        a = maxInt(&xmin1, &xmin2);
        b = minInt(&xmax1, &xmax2);
        c = maxInt(&ymin1, &ymin2);
        d = minInt(&ymax1, &ymax2);
        printf("%d %d %d %d\n", a,b,c,d);
        if ((a < b) && (c < d)) {
            printf("Intersection rectangle: (%d,%d)(%d,%d)\n", a,c,b,d);
        } else {
            printf("These two rectangles do not intersect\n");
        }
    }

}
return EXIT_SUCCESS;
}

int readRect(int *xmin, int *ymin, int *xmax, int *ymax){
int noItemsRead;
fflush(stdout);
noItemsRead = scanf("%d %d %d %d", xmin, ymin, xmax, ymax);

return noItemsRead;
}

int minInt(int *val1, int *val2){
if (val1 < val2){
    return *val1;
} else {
    return *val2;
}

}

int maxInt(int *val1, int *val2){
if (val1 > val2){
    return *val1;
} else {
    return *val2;
}
}

【问题讨论】:

  • 这是作业问题!
  • Basically the only part I'm having trouble is with the intersection part. 有什么问题?
  • 没有给出正确的值。如果我输入 1 1 4 4,然后输入 2 2 5 5,我得到 (1 1) (5 5)。正确答案是 (2 2) (4 4)

标签: c geometry


【解决方案1】:

除了你的函数maxIntminInt 之外,一切都很好。将if (val1 &lt; val2) 替换为if (*val1 &lt; *val2) 并将if (val1 &gt; val2) 替换为if (*val1 &gt; *val2)

int minInt(int *val1, int *val2){
    if (*val1 < *val2){
        return *val1;
    } 
    else {
        return *val2;
    }

}

int maxInt(int *val1, int *val2){
     if (*val1 > *val2){
         return *val1;
     } 
    else {
         return *val2;
}

【讨论】:

  • 我确实有这个,我刚刚使用了 a、b、c、d 来让眼睛更轻松。更改该行仍然会产生相同的错误答案。打孔 1 1 4 4, 2 2 5 5 得到 (1,1) (5,5) 而不是正确答案,即 (2,2) (4,4)。
  • 是的,刚抓到这个!谢谢。指针问题。
  • 我昨天回答了同样的question!。你们有同样的任务吗?
  • 哈哈,这家伙吓坏了,他还有一些与我相同任务的其他问题。好像他们肯定在我第一年的 CompuSci 课程中!小世界 :)。感谢您的帮助。
  • 评论一半针对 OP(“您不需要使用指针”),一半针对您(“无论如何都使用指针显示代码,但不建议在以下情况下使用指针)它们是不必要的”,也许有一些关于何时是个好主意的指导方针——大型结构等)。这是对答案的建议补充。无论如何,现在在 cmets 中讨论了这一点;它不需要进一步的打击。
【解决方案2】:

解决了我的问题,如果我更改,它会在以下几行中发生:

int minInt(int *val1, int *val2){
if (val1 < val2){
    return *val1;
} else {
    return *val2;
}

}

int maxInt(int *val1, int *val2){
if (val1 > val2){
    return *val1;
} else {
    return *val2;
}
}

int minInt(int *val1, int *val2){
if (*val1 < *val2){
    return *val1;
} else {
    return *val2;
}

}

int maxInt(int *val1, int *val2){
if (*val1 > *val2){
    return *val1;
} else {
    return *val2;
    }
}

进行逻辑比较时必须添加点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多