不会啊,大侠帮忙啊,同一平面上两个三角形相交部分面积

xiaozhang0372 2013-07-04 12:02:35
仔细观察下列图形:要求编程实现两个三角形相交后重叠部分的面积。真的不会啊啊啊啊啊,
谁给帮忙看看啊啊啊啊啊。。









这个编程怎么实现啊
...全文
1540 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lpcads 2013-07-16
  • 打赏
  • 举报
回复
蒙特卡洛法,我第一个想到的是这个...
无事所所 2013-07-16
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
帮帖主搭了个架子。谁让偶只是一名“架构师”呢?
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
HDC   hdc;
HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void ShowTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = TRUE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void Area_of_intersected_triangle() {
    int n,k;
    HBRUSH hbrush;
    RECT   rect;
    struct P {int x,y;};
    struct T {
        struct P a,b,c;
    } t1,t2;
    char s[10];

    hbrush=CreateSolidBrush((COLORREF)0x00FFFFFF);
    n=1;
    while (1) {
        t1.a.x=5+rand()%296;
        t1.a.y=5+rand()%296;
        t1.b.x=5+rand()%296;
        t1.b.y=5+rand()%296;
        t1.c.x=5+rand()%296;
        t1.c.y=5+rand()%296;
        //TODO:确定三点能构成三角形(任意两边长度之和大于第三边长度)
        //TODO:三点的顺序按逆时针顺序排列

        t2.a.x=5+rand()%296;
        t2.a.y=5+rand()%296;
        t2.b.x=5+rand()%296;
        t2.b.y=5+rand()%296;
        t2.c.x=5+rand()%296;
        t2.c.y=5+rand()%296;
        //TODO:确定三点能构成三角形(任意两边长度之和大于第三边长度)
        //TODO:三点的顺序按逆时针顺序排列

        //判断两个三角形的位置关系:分离、包含、重合(顶点、边)、相交。包含时计算小三角形面积。相交时求出相交部分,并划分为最多四个小三角形求它们的面积和。

        sprintf(s,"%d",n);
        TextOut(hdc,10,10,s,strlen(s));
        MoveToEx(hdc,t1.a.x,t1.a.y,NULL);
          LineTo(hdc,t1.b.x,t1.b.y);
          LineTo(hdc,t1.c.x,t1.c.y);
          LineTo(hdc,t1.a.x,t1.a.y);
        MoveToEx(hdc,t2.a.x,t2.a.y,NULL);
          LineTo(hdc,t2.b.x,t2.b.y);
          LineTo(hdc,t2.c.x,t2.c.y);
          LineTo(hdc,t2.a.x,t2.a.y);
        k=getch();
        if (k==27) break;
        n++;
        rect.left=0;
        rect.top=0;
        rect.right=300;
        rect.bottom=300;
        FillRect(hdc, &rect, hbrush);
    }
    DeleteObject(hbrush);
}
int main() {
    HWND  hwnd;

    srand(time(NULL));
    system("color F0");
    system("cls");
    HideTheCursor();
    hwnd  = GetConsoleWindow();
    hdc   = GetDC(hwnd);
    Area_of_intersected_triangle();
    ReleaseDC(hwnd,hdc);
    system("color 07");
    system("cls");
    ShowTheCursor();
    return 0;
}
赵老师不是我说你,你这干啥呢? 搞笑呢 这框架有用么?人家要的是具体算法的流程,你直接把todo里的给他不就行了?非要给个可执行代码,人家不做windows编程看这有用?
赵4老师 2013-07-05
  • 打赏
  • 举报
回复
引用 13 楼 xiaozhang0372 的回复:
[quote=引用 12 楼 zhao4zhong1 的回复:] 帮帖主搭了个架子。谁让偶只是一名“架构师”呢?

这个我没搞明白啊,我是个初学者,能不能给说下这个是神马意思啊。 还会报错的, S.OBJ : error LNK2001: unresolved external symbol "struct HWND__ * __stdcall GetConsoleWindow(void)" (?GetConsoleWindow@@YGPAUHWND__@@XZ) Debug/S.exe : fatal error LNK1120: 1 unresolved externals[/quote] 请将源代码后缀由.cpp改为.c
FancyMouse 2013-07-05
  • 打赏
  • 举报
回复
这问题不比凸多边形交简单。直接做凸多边形交,然后求面积,这approach更直接一些。
www_adintr_com 2013-07-04
  • 打赏
  • 举报
回复
如果是画在屏幕上,求相交的面积有多少像素还好办,用微分的方法就行 如果是连续的,还得积分,麻烦了 或者把每一种相交的情况都考虑到,再判断属于哪一种情况,分别计算各部分面积
赵4老师 2013-07-04
  • 打赏
  • 举报
回复
帮帖主搭了个架子。谁让偶只是一名“架构师”呢?
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
HDC   hdc;
HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void ShowTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = TRUE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void Area_of_intersected_triangle() {
    int n,k;
    HBRUSH hbrush;
    RECT   rect;
    struct P {int x,y;};
    struct T {
        struct P a,b,c;
    } t1,t2;
    char s[10];

    hbrush=CreateSolidBrush((COLORREF)0x00FFFFFF);
    n=1;
    while (1) {
        t1.a.x=5+rand()%296;
        t1.a.y=5+rand()%296;
        t1.b.x=5+rand()%296;
        t1.b.y=5+rand()%296;
        t1.c.x=5+rand()%296;
        t1.c.y=5+rand()%296;
        //TODO:确定三点能构成三角形(任意两边长度之和大于第三边长度)
        //TODO:三点的顺序按逆时针顺序排列

        t2.a.x=5+rand()%296;
        t2.a.y=5+rand()%296;
        t2.b.x=5+rand()%296;
        t2.b.y=5+rand()%296;
        t2.c.x=5+rand()%296;
        t2.c.y=5+rand()%296;
        //TODO:确定三点能构成三角形(任意两边长度之和大于第三边长度)
        //TODO:三点的顺序按逆时针顺序排列

        //判断两个三角形的位置关系:分离、包含、重合(顶点、边)、相交。包含时计算小三角形面积。相交时求出相交部分,并划分为最多四个小三角形求它们的面积和。

        sprintf(s,"%d",n);
        TextOut(hdc,10,10,s,strlen(s));
        MoveToEx(hdc,t1.a.x,t1.a.y,NULL);
          LineTo(hdc,t1.b.x,t1.b.y);
          LineTo(hdc,t1.c.x,t1.c.y);
          LineTo(hdc,t1.a.x,t1.a.y);
        MoveToEx(hdc,t2.a.x,t2.a.y,NULL);
          LineTo(hdc,t2.b.x,t2.b.y);
          LineTo(hdc,t2.c.x,t2.c.y);
          LineTo(hdc,t2.a.x,t2.a.y);
        k=getch();
        if (k==27) break;
        n++;
        rect.left=0;
        rect.top=0;
        rect.right=300;
        rect.bottom=300;
        FillRect(hdc, &rect, hbrush);
    }
    DeleteObject(hbrush);
}
int main() {
    HWND  hwnd;

    srand(time(NULL));
    system("color F0");
    system("cls");
    HideTheCursor();
    hwnd  = GetConsoleWindow();
    hdc   = GetDC(hwnd);
    Area_of_intersected_triangle();
    ReleaseDC(hwnd,hdc);
    system("color 07");
    system("cls");
    ShowTheCursor();
    return 0;
}
www_adintr_com 2013-07-04
  • 打赏
  • 举报
回复
第 10 修改一下, 不是 x1 <= x <= x2, 是 x1 < x < x2
www_adintr_com 2013-07-04
  • 打赏
  • 举报
回复
引用 6 楼 xiaozhang0372 的回复:
[quote=引用 3 楼 adlay 的回复:] [quote=引用 2 楼 xiaozhang0372 的回复:] [quote=引用 1 楼 adlay 的回复:] 如果是画在屏幕上,求相交的面积有多少像素还好办,用微分的方法就行 如果是连续的,还得积分,麻烦了 或者把每一种相交的情况都考虑到,再判断属于哪一种情况,分别计算各部分面积
具体的方案怎么设计啊,,都想了好久了。就是不知道该怎么做。[/quote] 你是哪种情况?离散的还是连续的?[/quote] 需要考虑6中情况啊,相交的各种情况,包含的各种情况,还有相交的面积最小的情况(也就是说只是边相交,其实面积等于0)[/quote] 我是考虑的用微积分的思想, 不用去判断那么多的情况: 1. 忽略三角形, 把他们当做 6 条线段. 2. 计算着六条线段两两之间的交点. 如果有线段重合的情况, 则中间重合的部分不算交点, 只把端点算交点. 3. 把这些交点按 x 坐标排序, 几个点 x 坐标相同的, 只取 1 个. 最终得到 x1, x2, x3 ... xn 4. 使用 x = x1, x = x2, ... x = xn 的直线, 把平面划分成 n + 1 个区域. 5. 对于 x < x1, x > xn 的区域, 是线段没有达到的区域, 忽略. 剩下 n - 1 个区域. 6. 对这 n - 1 个区域中的每一个区域进行如下的判断: (假设区域为 x1 < x < x2) 7. 如果没有线段穿过这个区域, 忽略. 8. 如果只有两条线段穿过这个区域, 则这个区域不包含重叠的三角形. 忽略. 9. 剩下的区域必定是有四条线段穿过的(重合的线段分开算成两条): 10. 取 x 等于区域内的任意值, 满足 x1 <= x <= x2 就行. 11. 通过 x 计算 4 调线段的 y 值. 从小到大排列为 y1 <= y2 <= y3 <= y4 12. 如果 y1 和 y2 来自不同的三角形, 则计算 y2, y3 和 x = x1, x = x2 围成的面积. 如果 y1 和 y2 来自同一个三角形, 则忽略. 注: 第 12 这个判断其实包含几种线段重合的特殊情况, 用 y1 和 y2 是否来自同一个三角形都可以解决: (1). y1 == y2, 则 y1 和 y2 肯定来自不同的三角形. 此时计算 y2 和 y3 之间的面积是对的. (2). 如果 y2 == y3, 则计算面积得到的也是 0, 不计算面积也可以. (3). y3 == y4, 此时 y1 和 y2 肯定也是来自不同三角形的, 计算 y2 和 y3 之间的面积还是对的.
赵4老师 2013-07-04
  • 打赏
  • 举报
回复
顶点和顶点重合 顶点在边上 边在边上 …… 两个三角形完全重合
赵4老师 2013-07-04
  • 打赏
  • 举报
回复
海伦公式
赵4老师 2013-07-04
  • 打赏
  • 举报
回复
向量叉乘 计算几何大牛:http://www.codeproject.com/KB/recipes/Wykobi.aspx
xiaozhang0372 2013-07-04
  • 打赏
  • 举报
回复
引用 3 楼 adlay 的回复:
[quote=引用 2 楼 xiaozhang0372 的回复:] [quote=引用 1 楼 adlay 的回复:] 如果是画在屏幕上,求相交的面积有多少像素还好办,用微分的方法就行 如果是连续的,还得积分,麻烦了 或者把每一种相交的情况都考虑到,再判断属于哪一种情况,分别计算各部分面积
具体的方案怎么设计啊,,都想了好久了。就是不知道该怎么做。[/quote] 你是哪种情况?离散的还是连续的?[/quote] 需要考虑6中情况啊,相交的各种情况,包含的各种情况,还有相交的面积最小的情况(也就是说只是边相交,其实面积等于0)
橡木疙瘩 2013-07-04
  • 打赏
  • 举报
回复
更正:判断a与b的角度正负,可以用向量叉乘。
橡木疙瘩 2013-07-04
  • 打赏
  • 举报
回复
先求相交多边形。 两个三角形都调整为逆时针顺序 求出所有交点,在交点处将相交的两条线段分为四条,并保持顺序。 每个交点应该有两条入边,两条出边。 从一个交点开始,判断两条出边a与b,如果a到b的角度为正(逆时针为正),则选择b,否则选择a 从选择的出边前进,找到下一个交点,重复上一步,直到回到出发点。 特殊处理: 1:两个三角形有一个顶点重合,并且没有其它交点:需要判断两个三角形是否有包含关系。 2:交点与其中一个三角形A顶点重合,并且没有其它交点;需要判断A是否被包含。 3:两个三角形有边重合,并且没有其它交点,需要判断两个三角形是否为包含关系。 判断a与b的角度正负,可以用向量点积
www_adintr_com 2013-07-04
  • 打赏
  • 举报
回复
引用 2 楼 xiaozhang0372 的回复:
[quote=引用 1 楼 adlay 的回复:] 如果是画在屏幕上,求相交的面积有多少像素还好办,用微分的方法就行 如果是连续的,还得积分,麻烦了 或者把每一种相交的情况都考虑到,再判断属于哪一种情况,分别计算各部分面积
具体的方案怎么设计啊,,都想了好久了。就是不知道该怎么做。[/quote] 你是哪种情况?离散的还是连续的?
xiaozhang0372 2013-07-04
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
如果是画在屏幕上,求相交的面积有多少像素还好办,用微分的方法就行 如果是连续的,还得积分,麻烦了 或者把每一种相交的情况都考虑到,再判断属于哪一种情况,分别计算各部分面积
具体的方案怎么设计啊,,都想了好久了。就是不知道该怎么做。
xiaozhang0372 2013-07-04
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
帮帖主搭了个架子。谁让偶只是一名“架构师”呢?

这个我没搞明白啊,我是个初学者,能不能给说下这个是神马意思啊。 还会报错的, S.OBJ : error LNK2001: unresolved external symbol "struct HWND__ * __stdcall GetConsoleWindow(void)" (?GetConsoleWindow@@YGPAUHWND__@@XZ) Debug/S.exe : fatal error LNK1120: 1 unresolved externals

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧