You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言graphics.h库统计像素及计算已知顶点多边形面积?

问题1:使用C语言的graphics.h库统计像素数量

graphics.h 是早期DOS环境下(比如Turbo C/Turbo C++)常用的图形库,统计像素数量的核心思路是遍历目标区域的每个像素点,根据需求完成计数:

实现步骤

  • 初始化图形模式:调用 initgraph() 指定驱动和分辨率
  • 遍历像素坐标:通过嵌套循环覆盖屏幕或指定区域的所有(x,y)位置
  • 获取像素颜色:用 getpixel(x,y) 读取当前点的颜色值
  • 计数逻辑:根据需求(统计全部像素、特定颜色像素)累加计数
  • 清理资源:用 closegraph() 关闭图形模式

示例代码:统计屏幕中红色像素的数量

#include <graphics.h>
#include <stdio.h>

int main() {
    int gd = DETECT, gm;
    int count = 0;
    int x, y;
    int red = RED; // graphics.h内置颜色常量

    // 初始化图形模式
    initgraph(&gd, &gm, "");

    // 遍历整个屏幕的像素(自动适配当前分辨率)
    for(y = 0; y < getmaxy(); y++) {
        for(x = 0; x < getmaxx(); x++) {
            if(getpixel(x, y) == red) {
                count++;
            }
        }
    }

    printf("红色像素数量:%d\n", count);

    // 等待按键后关闭窗口
    getch();
    closegraph();
    return 0;
}

如果要统计整个屏幕总像素数,直接计算 getmaxx() * getmaxy() 即可,无需遍历(效率更高);统计指定矩形区域的话,只需调整循环的x、y范围。


问题2:借助graphics.h统计多边形内部像素计算面积

已知多边形顶点坐标时,可通过射线法判断像素是否在多边形内部,统计内部像素的总数量——由于每个像素对应1个单位面积(假设图形模式分辨率为1像素=1平方单位),计数结果即为多边形的近似面积。

实现步骤

  • 初始化图形模式,可选绘制多边形用于可视化
  • 遍历屏幕所有像素点,用射线法判断点是否在多边形内部
  • 统计内部像素数量,该数值即为近似面积
  • 关闭图形模式释放资源

核心:射线法判断点是否在多边形内部

逻辑:从目标点向右发射一条水平射线,统计射线与多边形边的交点数。若交点数为奇数,点在内部;偶数则在外部。

示例代码

#include <graphics.h>
#include <stdio.h>
#include <stdbool.h>

// 判断点(x,y)是否在多边形内部
bool isPointInPolygon(int x, int y, int poly[][2], int vertices) {
    bool inside = false;
    int i, j;

    for(i = 0, j = vertices - 1; i < vertices; j = i++) {
        // 检查射线与多边形边的交点
        if( ((poly[i][1] > y) != (poly[j][1] > y)) &&
            (x < (poly[j][0] - poly[i][0]) * (y - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) ) {
            inside = !inside;
        }
    }
    return inside;
}

int main() {
    int gd = DETECT, gm;
    int count = 0;
    int x, y;

    // 示例多边形:四边形顶点坐标
    int polygon[4][2] = {{100,100}, {300,100}, {300,300}, {100,300}};
    int vertices = 4;

    // 初始化图形模式
    initgraph(&gd, &gm, "");

    // 绘制多边形(可选,用于可视化)
    drawpoly(vertices, (int*)polygon);

    // 遍历屏幕像素,统计内部点数量
    for(y = 0; y < getmaxy(); y++) {
        for(x = 0; x < getmaxx(); x++) {
            if(isPointInPolygon(x, y, polygon, vertices)) {
                count++;
                // 可选:标记内部像素为红色,直观查看
                putpixel(x, y, RED);
            }
        }
    }

    printf("多边形近似面积:%d 平方单位\n", count);

    getch();
    closegraph();
    return 0;
}

注意事项

  • 该方法是近似计算,分辨率越高,结果精度越高
  • 射线法对凹多边形同样有效,无需额外调整逻辑
  • 若不需要可视化,可去掉 drawpoly() 和 putpixel() 步骤,提升运行效率

内容的提问来源于stack exchange,提问作者RichpooR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:22:49