精华内容
下载资源
问答
  • OpenGL坐标系和像素坐标系
    2021-05-18 12:35:56

    OpenGL坐标系原点在中心,并且做了归一化处理。就是说xy轴,都是从[-1, 1]之间。而像素坐标系是同样的中心点,右上是正方向,只是没有做归一化处理,是以像素为单位的。那么,归一化的坐标系和像素坐标最大的区别就是在于,像素是实际的单位,会根据像素数值所变化。而归一化坐标是一个比例,只和屏幕的相对大小有关系。

    比如,在同样屏幕尺寸,高分辨率会压缩像素坐标,低分辨率会放大像素坐标。而归一化坐标,在同样尺寸屏幕上的位置不会变化,在不同尺寸的上比例相同。大部分动画软件和绘图软件都是像素坐标系,然后在传递给OpenGL的时候归一化处理。像素作为一个固定的单位,可以很直观的测量对比。

    但,在不同设备尺寸,不同分辨率的情况下。像素构建的大小在视觉上是不一样。尤其是位置信息,如果用像素距离来表示,那么最终呈现的距离感也是不统一的。比如,100个像素的距离,在高分辨率下,相对于低分辨率会更短。如果使用,归一化坐标,使用的是比例,看起来相对距离是一样的。比如,0.5个单位,那么在不同尺寸和分辨率下,都会是整体的50%。

    必然,有一套转换规则,能够在像素和比例之间转换。在此之前,有一个问题,就是归一化坐标,xy轴都是[-1, 1]之间的距离。这。。。不都是正方形了,那么矩形该怎么办呢。在OpenGL中,宽和高有一个比率。如果比率是1,那么宽高一样了。如果宽和高不一样,那么宽就会归一化到比率的值。比如宽就可能是[-1.5, 1.5]的范围内。

    下面给出,用c语言宏出来的一套转换,也很容易用其它语言翻译。

    typedef struct

    {

    /**

    * Screen pixel width

    */

    float screenWidth;

    /**

    * Screen pixel height

    */

    float screenHeight;

    /**

    * Screen half pixel width

    */

    float screenHalfWidth;

    /**

    * Screen half pixel height

    */

    float screenHalfHeight;

    /**

    * Screen width / height

    */

    float screenRatio;

    /**

    * Screen ratio / halfWidth

    */

    float ratioDivideHalfWidth;

    /**

    * Screen halfWidth / ratio

    */

    float halfWidthDivideRatio;

    }

    _AGLTool_;

    extern _AGLTool_ AGLTool[1];

    /**

    * Convert screen width to openGL width

    * same as (screenWidth) * AGLTool->screenRatio / AGLTool->screenHalfWidth

    */

    #define AGLTool_ToGLWidth(screenWidth) \

    ((screenWidth) * AGLTool->ratioDivideHalfWidth)

    /**

    * Convert pixel height to openGL height

    */

    #define AGLTool_ToGLHeight(screenHeight) \

    ((screenHeight) / AGLTool->screenHalfHeight)

    /**

    * Convert screen x to openGL x

    */

    #define AGLTool_ToGLX(screenX) \

    (AGLTool_ToGLWidth(screenX) - AGLTool->screenRatio)

    /**

    * Convert screen Y to openGL Y

    */

    #define AGLTool_ToGLY(screenY) \

    (1.0f - AGLTool_ToGLHeight(screenY))

    /**

    * Convert openGL Width to screen width

    * same as (glWidth) * AGLTool->screenHalfWidth / AGLTool->screenRatio

    */

    #define AGLTool_ToScreenWidth(glWidth) \

    ((glWidth) * AGLTool->halfWidthDivideRatio)

    /**

    * Convert openGL Height to screen height

    */

    #define AGLTool_ToScreenHeight(glHeight) \

    ((glHeight) * AGLTool->screenHalfHeight)

    /**

    * Convert openGL x to screen x

    */

    #define AGLTool_ToScreenX(glX) \

    AGLTool_ToScreenWidth((glX) + AGLTool->screenRatio)

    /**

    * Convert openGL y to screen y

    */

    #define AGLTool_ToScreenY(glY) \

    AGLTool_ToScreenHeight(1.0f - (glY))

    /**

    * Convert width to texcoord width

    * parameters both openGL or screen coordinate

    */

    #define AGLTool_ToTexcoordWidth(width, textureWidth) \

    ((width) / (textureWidth))

    /**

    * Convert height to texcoord height

    * parameters both openGL or screen coordinate

    */

    #define AGLTool_ToTexcoordHeight(height, textureHeight) \

    ((height) / (textureHeight))

    _AGLTool_ AGLTool[1] =

    {

    0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,

    };

    static void SetSize(int width, int height)

    {

    AGLTool->screenWidth = (float) width;

    AGLTool->screenHeight = (float) height;

    AGLTool->screenRatio = (float) width / (float) height;

    AGLTool->screenHalfWidth = (float) width / 2;

    AGLTool->screenHalfHeight = (float) height / 2;

    AGLTool->ratioDivideHalfWidth = AGLTool->screenRatio / AGLTool->screenHalfWidth;

    AGLTool->halfWidthDivideRatio = AGLTool->screenHalfWidth / AGLTool->screenRatio;

    }

    SetSize设定了屏幕的宽高之后,就可以使用宏来转换像素坐标和OpenGL的坐标了。可以互相转换宽高到归一化化坐标上,也能互相转换坐标点。最后,我倾向于,统一使用OpenGL的坐标系,这样屏幕的适配问题就不存在了,所有的设定都是根据比例来的。这样,就要求所有的像素单位,都需要进行一次转化。缺点,就是在设定大小和距离的时候,归一化坐标不够直观,没有像素坐标来的直接。

    另外,如果某些工具导出的数据是像素单位,那么在设置相对于这个数据的位置距离时候,也需要使用像素坐表来固定相对位置。

    更多相关内容
  • quadrant body { padding: 0; margin: 0; background-color: #333;... 本文为测试canvas的基本API,并实现了绘制平面直角坐标系及函数线条功能,但因目前画布像素仅为640*640,绘制效果较差,不能够投入实际使用。
    quadrant

    body {

    padding: 0;

    margin: 0;

    background-color: #333;

    }

    input {

    border: solid 0px #DDD;

    border-radius: 5px;

    padding: 5px 10px;

    }

    button {

    border: solid 0px #CCC;

    border-radius: 5px;

    background-color: #FFF;

    padding: 5px 10px;

    }

    #quadrant {

    background-color: #CCC;

    width: 640px;

    height: 640px;

    margin: 50px auto 0 auto;

    }

    draw

    reset

    var defaultColor = '#333';

    var $quadrant = $('#quadrant');

    var $canvas = $quadrant.find('canvas');

    $quadrant.css('margin-top', ($(window).height() - $canvas.height()) / 2);

    var ctx = $canvas.get(0).getContext("2d");

    // 绘制线条

    function drawLine(ctx, config) {

    if(ctx && config && config.x0 && config.y0 && config.x1 && config.y1) {

    // 默认线条颜色为灰色

    var color = config.color;

    if(typeof(color) === 'undefined' || color.length <= 0) {

    color = defaultColor;

    }

    ctx.strokeStyle = color;

    // 绘制线条

    var x0 = config.x0,

    y0 = config.y0,

    x1 = config.x1,

    y1 = config.y1;

    ctx.moveTo(x0, y0);

    ctx.lineTo(x1, y1);

    ctx.stroke();

    }

    }

    // 绘制点

    function drawPoint(ctx, config) {

    if(ctx && config && config.x && config.y) {

    config.x0 = config.x - 1;

    config.y0 = config.y - 1;

    config.x1 = config.x;

    config.y1 = config.y;

    drawLine(ctx, config);

    }

    }

    // 绘制尖角

    function drawAngle(ctx, config) {

    var size = config.size ? config.size : 5;

    var top = config.top;

    var left = config.left;

    var mode = config.mode ? config.mode : 1;

    var color = config.color ? config.color : ''

    if(size && top && left && mode) {

    if(mode > 4 || mode 

    mode = 1;

    }

    var line1Config = {}, line2Config = {};

    line1Config.x0 = line2Config.x0 = left;

    line1Config.y0 = line2Config.y0 = top;

    switch(mode) {

    case 1:// 开口向左

    line1Config.x1 = left - size;

    line1Config.y1 = top + size;

    line2Config.x1 = left - size;

    line2Config.y1 = top - size;

    break;

    case 2:// 开口向上

    line1Config.x1 = left - size;

    line1Config.y1 = top - size;

    line2Config.x1 = left + size;

    line2Config.y1 = top - size;

    break;

    case 3:// 开口向右

    line1Config.x1 = left + size;

    line1Config.y1 = top + size;

    line2Config.x1 = left + size;

    line2Config.y1 = top - size;

    break;

    case 4:// 开口向下

    line1Config.x1 = left - size;

    line1Config.y1 = top + size;

    line2Config.x1 = left + size;

    line2Config.y1 = top + size;

    break;

    }

    drawLine(ctx, line1Config);

    drawLine(ctx, line2Config);

    }

    }

    // 创建坐标系

    var cWidth = $canvas.get(0).width;

    var cHeight = $canvas.get(0).height;

    var qPadding = 50;

    var qWidth = cWidth - qPadding * 2;

    var qHeight = cHeight - qPadding * 2;

    function createQuadrant(ctx) {

    // 绘制x轴

    var xLine = {

    x0: qPadding,

    y0: qPadding + qHeight / 2,

    x1: qPadding + qWidth,

    y1: qPadding + qHeight / 2

    };

    drawLine(ctx, xLine);

    drawAngle(ctx, {top: xLine.y1, left: xLine.x1, model: 1});

    // 绘制y轴

    var yLine = {

    x0: qPadding + qWidth / 2,

    y0: qPadding,

    x1: qPadding + qWidth / 2,

    y1: qPadding + qHeight

    };

    drawLine(ctx, yLine);

    drawAngle(ctx, {top: yLine.y0, left: yLine.x0, mode: 4});

    }

    createQuadrant(ctx);

    // 绘制函数图像

    function drawFunction(ctx, func) {

    // 绘制坐标系中的点

    function drawQuadrantPoint(x, y) {

    // 换算坐标系与画布中的点

    var cX = qPadding + qWidth / 2 + x;// canvas x

    if(cX > cWidth - qPadding) {

    cX = cWidth - qPadding;

    }

    if(cX 

    cx = qPadding;

    }

    var cY = qPadding + qHeight / 2 - y;

    if(cY > cHeight - qPadding) {

    cY = cHeight - qPadding;

    }

    if(cY 

    cY = qPadding;

    }

    drawPoint(ctx, {'x': cX, 'y': cY});

    }

    // 计算坐标系的最大最小值

    var minX = qWidth / -2, maxX = qWidth / 2;

    for(var i=minX; i<=maxX; i++) {

    var y = func(i);

    drawQuadrantPoint(i, y);

    }

    }

    // 清空坐标系

    function resetQuadrant(ctx) {

    ctx.beginPath();

    ctx.clearRect(0, 0, cWidth, cHeight);

    createQuadrant(ctx);

    }

    $(function() {

    var $func = $('input[name="func"]').val('Math.tan(x)');

    $('#draw').on('click', function(event) {

    resetQuadrant(ctx);

    var funcStr = $func.val();

    drawFunction(ctx, function(x) {

    return eval(funcStr);

    });

    }).click();

    $('#reset').on('click', function(event) {

    resetQuadrant(ctx);

    });

    });

    本文为测试canvas的基本API,并实现了绘制平面直角坐标系及函数线条功能,但因目前画布像素仅为640*640,绘制效果较差,不能够投入实际使用。

    展开全文
  • 用Flash与C语言制作工程实时数据动态曲线图宋国志songguozhi1234@163.com本文旨在说明如何利用Flash和C语言制作BS模式下的实时数据动态曲线图,现在流行的实时数据曲线图,大都是采用了CS模式的开发语言,BS模式的虽...

    用Flash与C语言制作工程实时数据动态曲线图

    宋国志songguozhi1234@163.com

    本文旨在说明如何利用Flash和C语言制作BS模式下的实时数据动态曲线图,现在流行的实时数据曲线图,大都是采用了CS模式的开发语言,BS模式的虽有一些实例,比如google上的股市曲线图,但其实现的方式和流程在网上很少能见到。

    其运行时的界面如下,数据实时更新,曲线图从左往右动态移动:

    下面先讲在实现过程中的工作环境以及开发工具进行简单的介绍:

    1.Macromedia Flash Professional 8;

    2.Macromedia Dreamweaver 8;

    3.标准C;

    4.操作系统:Windows,主要用来制作Flash和网页;

    5.操作系统:Linux,用作网站的服务器,安装apache;

    6.apache软件。

    假设以上的环境都已经安装完毕,并经测试运行正常,下面就逐步的介绍开发过程:

    一.在制作此例前,我假设您已了解以下Flash知识点:

    1.使用this.createEmptyMovieClip动态创建MovieClip;

    2.使用AS绘制线条或矩形;

    3.对Flash中“深度”的理解;

    4.使用this.createTextField动态创建文本框

    二.正式开始

    1.创建一个空白文档,有两个层:

    看上图,两个层:

    A.script:放置一些脚本;

    B.坐标曲线: 放置一个MovieClip,即生成的曲线;

    2.按Ctrl+F8新建一个影片剪辑(MovieClip),里面放置一个动态文本框,实例名称为:tips,如下图:

    f64efd0741f1d1d14a5ad64f072c582b.png3.返回场景,将刚才制作的mc坐库中托至场景(放在可视区域外),并且命名为:mouse_mc,如图:

    4.按Ctrl+F8新建一个影片剪辑(MovieClip):坐标曲线,有三个层:,如下图:

    04ebdb728318318727cb7b45ac9e2233.png

    A.script:放置一些脚本;

    B.文字:放置x,y轴的说明文字;

    C.xy轴: 放置x,y坐标轴;

    5.在影片剪辑“坐标曲线”的“xy轴”层上画x,y坐标线:

    e3226dae90d1d30dece7bb1a830fbe1d.png

    这步就是注意坐标轴的中心点,画在影片剪辑的注册点上,即_x=0,_y=0处;

    6.在坐标轴附近,创建二个动态文本框,分别指定变量名为:name_x,name_y,如下图:

    03abfaff259b22a32df53621a9c5f91f.png

    这二个文本框用来显示坐标轴的说明文字;

    7.接着在的“script”层的第一帧,加入如下代码:

    //载入实时数据的对象

    newFollow=new LoadVars();

    //x,y轴的名称

    name_x = "Time(S)";

    name_y = "Data";

    //x轴刻度总长

    var xtotal:Number=120;

    //y轴刻度总长

    var ytotal:Number=100;

    //存放曲线上点的数组

    var point_arr:Array=new Array();

    //曲线上点的个数,最大为120(表示2分钟)

    var numPoints:Number;

    numPoints=0;

    //x轴单位刻度的像素数

    var xspace = Math.floor(360/xtotal);

    //y轴单位刻度的像素数

    var yspace = Math.floor(200/ytotal);

    //画X轴刻度

    DrawScalX(xtotal);

    //画Y轴刻度

    DrawScalY(ytotal);

    //画X轴刻度

    function DrawScalX(total:Number) {

    createEmptyMovieClip("scalX_mc", 1);

    scalX_mc.lineStyle(1, 0x6699CC, 80);

    var i:Number;

    for (i=1; i

    if (i%10 == 0) {

    scalX_mc.lineStyle(1, 0x6699CC, 70);

    scalX_mc.moveTo(xspace*i, 0);

    scalX_mc.lineTo(xspace*i, -6);

    CreateText(i, xspace*i-14-5*xspace+15, 5);

    } else {

    scalX_mc.lineStyle(1, 0x6699CC, 30);

    scalX_mc.moveTo(xspace*i, 0);

    scalX_mc.lineTo(xspace*i, -4);

    }

    }

    }

    function DrawScalY(total:Number) {

    createEmptyMovieClip("scalY_mc", 2);

    var i:Number;

    for (i=1; i

    if (i%10 == 5) {

    scalY_mc.lineStyle(1, 0x6699CC, 50);

    scalY_mc.moveTo(0, 0-(yspace*i));

    scalY_mc.lineTo(7, 0-(yspace*i));

    } else if (i%10 == 0) {

    scalY_mc.lineStyle(1, 0x6699CC, 80);

    scalY_mc.moveTo(0, 0-(yspace*i));

    scalY_mc.lineTo(8, 0-(yspace*i));

    CreateText(i, -30, 0-(yspace*i)-9);

    } else {

    scalY_mc.lineStyle(1, 0x6699CC, 30);

    scalY_mc.moveTo(0, 0-(yspace*i));

    scalY_mc.lineTo(4, 0-(yspace*i));

    }

    }

    }

    //建立x,y轴的坐标文本

    function CreateText(txt:Number, X:Number, Y:Number) {

    var my_txt = createTextField("my_txt"+txt, Math.floor(Math.random()*100000), X, Y, 30, 30);

    my_txt.multiline = false;

    my_txt.wordWrap = true;

    my_txt.selectable = false;

    var my_fmt:TextFormat = new TextFormat();

    my_fmt.color = 0x999999;

    my_fmt.align = "center";

    my_txt.text = txt;

    my_txt.setTextFormat(my_fmt);

    }

    //画曲线

    function DrawLine() {

    createEmptyMovieClip("curve_mc", 3);

    //曲线填充色

    curve_mc.beginFill(0xFFFFCC, 50);

    //曲线颜色

    curve_mc.lineStyle(1, 0xFF6600, 100);

    curve_mc.moveTo(0, 0);

    for (var i = 0; i

    curve_mc.lineTo(i*xspace, 0-point_arr[i]*yspace);

    DrawCircle((i), 0-(point_arr[i]));

    }

    curve_mc.lineTo(((point_arr.length-1)*xspace), 0);

    curve_mc.lineStyle(1, 0x000000, 0);

    curve_mc.lineTo(0, 0);

    curve_mc.endFill();

    if (point_arr[0])

    _root.cnp="即时数据:"+point_arr[0]+" P/S";

    }

    //构造曲线上点的数组

    function display() {

    //曲线上新点的y轴坐标值

    var str:String;

    var i:Number;

    newFollow.load("/cgi-bin/getdata.cgi?nocahe="+getTimer());

    newFollow.onLoad=function(){

    str=newFollow.new_point;

    for (i=numPoints; i>0; i--) {

    point_arr[i]=point_arr[i-1];

    }

    if (numPoints<120)

    numPoints++;

    point_arr[0]=str;

    }

    //画曲线

    DrawLine();

    }

    setInterval(display,1000);

    stop();

    8.返回场景,在场景的第一帧加入如下代码:

    //让鼠标提示内容的宽度根据内容的多少自动调整

    mouse_mc.tips.autoSize = true;

    //页面的编码方式

    System.useCodepage = true;

    9.将库中的“坐标曲线”影片剪辑拖至场景中,命名为:mc,如下图:

    da6611a2671ae86fba5b92929d69dc0e.png10.参数说明:

    //载入实时数据的对象

    newFollow=new LoadVars();

    //x,y轴的名称

    name_x = "Time(S)";

    name_y = "Data";

    //x轴刻度总长

    var xtotal:Number=120;

    //y轴刻度总长

    var ytotal:Number=100;

    //存放曲线上点的数组

    var point_arr:Array=new Array();

    //曲线上点的个数,最大为120(表示2分钟)

    var numPoints:Number;

    numPoints=0;

    11.制作Flash影片

    导出影片并保存为Real-Time_curve.swf,制作一个网页,将该影片插入到网页中,保存网页为Real-Time_curve.html,然后将该网页和Flash影片一起上传到apache服务器的htdocs目录中。但记得要修改这两个文件的权限,否则在测试的时候会出现无权访问的错误。

    三.制作实时数据源

    在Linux下编写一个模拟实时数据产生器,其代码如下:

    #include

    int main(void)

    {

    srand((int)time(0));

    printf("Content-type: text/html/n/n");

    printf("new_point=%d", rand()%101);

    return 0;

    }

    将代码保存为getdata.c,并将编译后的可执行文件命名为getdata。将可执行的getdata保存到apache服务器的cgi-bin目录中。

    在上面的代码中,值得注意的是两个printf语句。第一个printf语句是cgi编程的规范,在这里我不做阐述,可以查阅相关资料做进一步的理解,而第二个printf语句实际上与前面介绍的Flash中的newFollow.load("/cgi-bin/getdata.cgi?nocahe="+getTimer())构成了一个实时数据的通信接口。

    四.问题讨论

    1.保证数据的实时刷新。在IE浏览器中可能由于缓存的原因而导致Flash无法实时动态的显示,因此在Flash中必须使浏览器每次都从服务器上去读取数据,而不会使用本地的缓存,因此在Flash中调用实时数据源时加上了参数nochae=getTimer(),由于getTimer()在每次调用的时候的值不同,使浏览器认为是调用一个新的程序,这样保证数据的有效性和实时性。

    2.动态曲线的刷新频率。setInterval(display,1000)使浏览器每隔一秒钟就调用一次display()函数,重新获取一次数据,然后绘制新的曲线。

    3.曲线上点的值保存在一维数组point_arr中,使用该一维数组可以同时体现出曲线上坐标点的位置,数组元素的下标值即为曲线的X坐标值,该下标所对应的数组元素值就为曲线的Y坐标值。由于曲线上总共可以显示120个点的值,也即是2分钟的数据,因此数组的长度也设置为120,2分钟之前的元素没有采用溢出,而是采用的覆盖的方式,这样对系统来说也安全,以免造成内存问题。

    4.当然,曲线图的X/Y轴的名称以及轴上的刻度大小都是可以通过html或者其他语言在调用Flash影片时作为参数传递给Flash。

    作者:宋国志

    2008年9月5日

    展开全文
  • 全程代码小编就在这里发出来了哈,最终的效果图,// c语言+图形编程 电脑时钟//包含头文件#include#include#includevoid Draw_Dial();//绘制静态的表盘void Draw_Hand(int hour, int minute, int secend); //绘制...

    2c4a8143587e

    全程代码小编就在这里发出来了哈,最终的效果图,

    2c4a8143587e

    // c语言+图形编程 电脑时钟

    //包含头文件

    #include

    #include

    #include

    void Draw_Dial();//绘制静态的表盘

    void Draw_Hand(int hour, int minute, int secend); //绘制表针

    //主函数

    int main()

    {

    initgraph(640, 480);//初始化一个图形界面 640*480

    //circle(320,240,150);//画圆的函数

    //rectangle(0, 0, 50, 50);//画正方体的函数

    Draw_Dial();

    setwritemode(R2_XORPEN);//设置XOR绘图模式

    SYSTEMTIME time;//定义一个时间结构体 用来保存当前的时间

    while (!_kbhit())

    {

    GetLocalTime(&time);//获取当前的时间

    Draw_Hand(time.wHour,time.wMinute,time.wSecond); //把表针绘制出来

    Sleep(1000);//间隔1秒 1000毫秒

    Draw_Hand(time.wHour, time.wMinute, time.wSecond); //把表针绘制出来

    }

    closegraph();//关闭图形界面

    return 0;

    }

    //绘制静态的表盘

    void Draw_Dial()

    {

    //绘制边界

    setcolor(GREEN);

    circle(320, 240, 160);//画圆函数的参数 320 240坐标 160是圆的半径大小

    circle(320, 240, 60);

    circle(320, 240, 2);

    //图形界面的输出文本信息 txt text 文字

    outtextxy(260,420,L"GOOD GOOD STUDY");

    outtextxy(283, 440, L"DAY DAY UP");

    //line(0, 0, 639, 479);

    //绘制刻度

    //circle(320, 85, 2);

    setcolor(WHITE);

    int x, y;

    for (int i = 0; i

    {

    x = 320 + int(145 * sin(PI * 2 * i / 60));

    y = 240 + int(145 * cos(PI * 2 * i / 60));

    if (i % 15 == 0)

    bar(x - 5, y - 5, x + 5, y + 5);

    else if (i % 5 == 0)

    circle(x, y, 3);

    else

    putpixel(x, y, WHITE); //点

    }

    }

    //绘制表针

    void Draw_Hand(int hour, int minute, int second)

    {

    double h_hour, h_minute, h_second; //三个弧度值

    int x_hour, y_hour, x_minute, y_minute, x_second, y_second; //末端位置

    //计算弧度值

    h_second = second * 2 * PI / 60;

    h_minute = minute * 2 * PI / 60 + h_second / 60;

    h_hour = hour * 2 * PI / 12 + h_minute / 12;

    //计算末端位置

    x_second = int(120 * sin(h_second)); y_second=int(120 * cos(h_second));

    x_minute = int(100 * sin(h_minute)); y_minute = int(100 * cos(h_minute));

    x_hour = int(70 * sin(h_hour)); y_hour = int(70 * cos(h_hour));

    //绘制秒针

    setlinestyle(PS_SOLID, 2); //PS_SOILD 实线 2像素 线条的粗细

    setcolor(RED);

    line(320 + x_second, 240 - y_second, 320 - x_second / 3, 240 + y_second / 3);

    //绘制分针

    setlinestyle(PS_SOLID, 6); //PS_SOILD 实线 2像素 线条的粗细

    setcolor(YELLOW);

    line(320 + x_minute, 240 - y_minute, 320 - x_minute / 5, 240 + y_minute/5);

    //绘制时针

    setlinestyle(PS_SOLID, 7); //PS_SOILD 实线 2像素 线条的粗细

    setcolor(GREEN);

    line(320 + x_hour, 240 - y_hour, 320 - x_hour / 5, 240 + y_hour/5);

    }

    演示一番 是不是???逼格不高,这只怕是最简易的一个时钟了吧。对了。注意一下!!!记得没安装图形库的,记得要去安装哟。。。。

    2c4a8143587e

    2c4a8143587e

    展开全文
  • C语言画函数图像横纵坐标单位长度比校正(3:5)真正的余弦函数#include#includeint sishewuru(float a);void main(){int n = 450;float a[500], b[500];int i,j;a[0] = b[0] = 0;for (i = 1; i < n; i++){a[i] = ...
  • C# 绘制直角坐标系

    2020-12-10 15:12:34
    转载:对自己项目有帮助,git的代码...如果想在C#窗口中绘制正常的直角坐标系,例如入下图所示的第一象限的坐标系图形,就需要做专门的处理了。 本文介绍如何绘制如上图所示的第一象限的直角坐标系。 用到的Grap...
  • 建立合适的坐标系,进行绘图

    千次阅读 2018-04-09 08:48:02
    下面介绍一下如何在VC中建立我们想要的坐标系。 一 设备坐标和逻辑坐标 设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标。通常将屏幕上的设备坐标称为屏...
  • C语言中绘图的函数库

    千次阅读 2021-05-18 14:11:25
    1、可编辑C语言中绘图的函数库图形和图像函数包含在graphics.h里面 (一) 像素函数 56. putpiel() 画像素点函数 57. getpixel()返回像素色函数 (二) 直线和线型函数 58. line() 画线函数 59. lineto() 画线函数 60. l...
  • 今天写了一个求点集合的凸包的一个算法,虽然结果求解出来了,但是想将过程用GDI+绘制出来,就需要将点绘制出来,然而c#GDI+中绘图的坐标与我们常用数学中笛卡尔坐标系是不一样的,所以就要转换GDI+中的坐标,通过...
  • 使用VC++绘制坐标系

    万次阅读 2016-03-22 19:22:18
    首先打开VC++,新建一个单文档应用程序; 按下图,为View类添加消息处理函数,变更单文档窗体背景色为黑色; 在菜单中添加如下菜单;...//坐标系类别 int w,h; //存储窗口宽和高 int w2,h
  • 其原理是:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。Bresenham算法也是一种计算机图形学中常见的绘制直线的算法,其...
  • 建立以图像中心为原点的坐标系,求出x>0的所有像素点的坐标。虽然没有悬赏,但可以私聊
  • 摘要:我国使用的坐标系统主要有1954年北京坐标系、1980年西安坐标系、CGCS-2000国家大地坐标系以及地方独立坐标系。随着信息共享的扩大化,数据标准的统一化,4D产品客观的需要进行坐标系统的任意转换。数字正射...
  • TurboC提供了非常丰富的图形函数,所有图形函数的原型均在graphics.h中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有...
  • 利用VC绘制对数坐标系

    千次阅读 2008-02-21 14:28:00
    利用VC绘制对数坐标系目标:绘制以任意频率为起点、任意频率为终点的对数坐标,并能对坐标进行任意缩放。实现方法:1、定义标准频率:频率值为10N的相应的频率点,其中N=…-2,-1,0,1,2,3…,单位MHz。如0.01MHZ、0.1...
  • C语言图形函数

    2021-05-22 03:41:28
    C语言图形函数》由会员分享,可在线阅读,更多相关《C语言图形函数(27页珍藏版)》请在人人文库网上搜索。1、Turbo C绘图程序设计,图形显示器的工作方式,IBM PC 机的显示器可以在两种基本视频方式下工作:文本方式...
  • 目录前言我参考的资料GLSL入门顶点与片段着色器变量修饰向量操作矩阵运算使用纹理数学帮助函数坐标系世界坐标系 前言 minecraft作为一款知名的沙盒游戏,影响了一代人 ,我从初中开始玩minecraft,一直玩到带学 。...
  • --从逻辑笛卡尔坐标映射到物理屏幕像素坐标; --视口就是窗口内部用于绘制裁剪区域的客户区域;视口不一定就是整个窗口,逻辑坐标的每个单位不一定与屏幕像素一一对应。 11. 投影:从3D到2D,两种投影方式:正投影...
  • 常用C语言图形函数

    2021-05-20 16:30:51
    TurboC绘图程序设计 图形显示器的工作方式 IBMPC机的显示器可以在两种...pixel 它是组成图形的基本元素 在图形方式下 屏幕上每个像素的显示位置用屏幕坐标系来描述 在该坐标系中 屏幕左上角为坐标系的原点 坐标值为...
  • C语言图形编程》.pdfC 语言图形编程一、字符屏幕一、 屏幕操作函数1. clrscr()清除字符窗口函数2. window()字符窗口函数3. gotoxy()光标定位函数4. clreol() 清除光标行尾字符函数5. insline() 插入空行函数6. ...
  • C语言图形化操作

    万次阅读 多人点赞 2018-05-25 21:18:57
    C语言图形化操作 有时候,我们需要进行一些图形化操作,完成对所在项目的美化。例如,做贪吃蛇大作战,简单的用户注册模块。这时,就需要进行图形化操作,来进行美化。例如: 从上面我们发现,这是不是和...
  • 浅谈C语言嵌入式系统编程注意事项

    千次阅读 2015-07-26 00:39:50
    C语言嵌入式系统编程注意事项之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程技巧 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必...
  • OpenGL像素操作

    2021-01-17 17:25:02
    今天我们先简单介绍Windows中常用的BMP文件格式,然后讲OpenGL的像素操作。虽然看起来内容可能有点多,但实际只有少量几个知识点,如果读者对诸如“显示BMP图象”等内容比较感兴趣的话,可能不知不觉就看完了。像素...
  • C语言图形编程中的绘图函数~

    千次阅读 多人点赞 2017-02-01 16:19:44
    说明: 参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值。 此函数相应的头文件是graphics.h 返回值: 无 例: 在屏幕上(6,8)处画一个红色像素点: ...
  • [高等教育]C语言图形编程C 语言图形编程一、字符屏幕一、 屏幕操作函数1. clrscr()清除字符窗口函数2. window()字符窗口函数3. gotoxy()光标定位函数4. clreol() 清除光标行尾字符函数5. insline() 插入空行函数6. ...
  • 车牌识别C语言源码

    千次阅读 多人点赞 2018-05-05 15:48:31
    欢迎加入群105060236讨论。2011-11-23更新本算法主要分成这几个部分,图像采集(即图像输入)、图像预处理(粗略定位车牌位置)、图像处理(精确确定车牌位置,去噪)、车牌字符分割(上下边界,左右边界确定)和...
  • WebGL教程

    2021-03-07 07:38:05
    都是建立在本节课所说的WebGL 坐标系统之上,例如无人机导航中的所说的机体坐标系、地球坐标系都是直接对现实中事物的描述,三维场景中的各类坐标系与无人机中坐标系没什么区别,但是要显示在屏幕上,就要经过一些...
  • C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能...
  • OpenGL入门学习[十]今天我们先简单介绍Windows中常用的BMP文件格式,然后讲OpenGL的像素操作。虽然看起来内容可能有点多,但实际只有少量几个知识点,如果读者对诸如“显示BMP图象”等内容比较感兴趣的话,可能不知...
  • C语言实训小记

    2019-07-01 22:51:39
    而且图上第一个点是在图片的最左下角,以左下角的点为原点做坐标系来求坐标。然后利用中学的圆的参数方程就可以算出(x,y)。 具体步骤是: (1)整个读取文件,存放到内存buf()中 (2)计算圆上的点(x,y),buf...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,169
精华内容 467
关键字:

c语言建立像素坐标系