中华农历论坛知识讨论区历法知识 → [原创]用汉编绘五角星(附英文程序比较)


  共有26125人关注过本帖树形打印

主题:[原创]用汉编绘五角星(附英文程序比较)

帅哥哟,离线,有人找我吗?
秦汉昌
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1447 威望:0 精华:0 注册:2008/12/20 18:10:00
[原创]用汉编绘五角星(附英文程序比较)  发帖心情 Post By:2009/12/25 21:51:00


255 9 52 RGB 新颜色 粉红色
155 6 36 RGB 新颜色 深红色

扩展对象 五角星绘制窗口  继承自 窗口对象模板

按钮控制 新对象0
按钮控制 新对象1
按钮控制 新对象2

\ 窗口内过程、事件、变量、实例对象、缓冲等
 
属性 窗口标题:
     编字串" 五角星绘制"
     属性。
属性 开始尺寸:
     500 500
     属性。
属性 开始位置:
     自动居中: 自本身
     属性。

\ 32位变量 曲线数
6 给 曲线数
建词 曲线缓冲 曲线数 3 * 1+ 8 * 字节空出


编 平方根
 4 位小数
 ♂ 属性值 0= 就 数>实 然后
 ♂ 0< 就 全复位 然后
 1.0 环首 ♂ 2 § ∽ / + 2.0 /
 ↑↓ ∽ - 绝对值 .0001 < 就出来 ↑↓♀ 。

编 乘根号三
  3 平方根 * 实>数  。


0  给  横坐标
0  给  纵坐标


编 点X变换
  横坐标     +     。

编 点Y变换
  纵坐标 ↑↓ -    。  

 

编 点X写入   ( X 点 缓冲 --- )
   ↑↓   1- 8 *      +  写 。
编 点Y写入   ( Y 点 缓冲 --- )
   ↑↓  1- 8 * 4 +  +  写 。
编 点X读取   (  点 缓冲 --- X )
   ↑↓  1- 8 *      +  读 。
编 点Y读取   (  点 缓冲 ---  Y )
   ↑↓  1- 8 * 4 + +  读 。

  210  给  绘图区

编 覆盖绘图区
   浅灰色  画线颜色: 设备描述表
    浅灰色  画刷颜色: 设备描述表
    0  点X变换  0  点Y变换
    绘图区  填充圆: 设备描述表
   。


对象事件 初始时:
         本身的 启动: 新对象0
         435 11 60 23 定位: 新对象0
         字串" 三角星"   置控制对象标题: 新对象0
         本身的 启动: 新对象1
         435 46 60 23 定位: 新对象1
         字串" 五角星"   置控制对象标题: 新对象1
         本身的 启动: 新对象2
         435 76 60 23 定位: 新对象2
         字串" 十角星"   置控制对象标题: 新对象2
          \ 窗口初始事件: 不包含 '编' '变量:' '为'等,直接输入执行的动作词
         对象事件。

编 转弧度 π 180.0 / * 。

编 转角度 180.0 π / * 。

0  给  五星色

编 点修正  ( N --- )
   { N \ -- }
 ♂ N 2 * 1+ =
 就    ♀  1
 否则  ♂ 0=
 就   ♀  N 2 *
 然后
 然后
 。

编 星常量   (  R  N  --- )
   { \ R0 N0 -- } 数>实  写入  N0 数>实  写入  R0
    N0 3.0 >
   就    R0  360.00 N0 4.00 * /  转弧度  FCOS  *
             360.00 N0 2.00 * /  转弧度  FTAN  *
         R0  360.00 N0 4.00 * /  转弧度  FSIN  *  -
   否则   R0 3.0 /
   然后
   。

编 转横坐标     (  R 偏移  --- )
     ∵  数>实 +  转弧度  FCOS     *    实>数 点X变换         。

编 转纵坐标     (  R 偏移  --- )
    ∵  数>实 +  转弧度  FSIN    *     实>数  点Y变换         。

编 角星   ( X Y R 偏移度 颜色一 颜色二  N  --- )
         { X Y R 偏移度 颜色一 颜色二 N \ 曲线缓冲 -- }  0  写入  五星色
         N  2 *  1+  8  *  个字节空给  曲线缓冲  
         X        写入 横坐标 Y        写入  纵坐标
   N 0                                                          \   置坐标点
  ?循环 
        内环数 数>实  360. N  数>实 /      *                偏移度 R   数>实  转横坐标   内环数 2 * 1+   曲线缓冲 点X写入
        内环数 数>实  360. N  数>实 /      *                偏移度 R   数>实  转纵坐标   内环数 2 * 1+   曲线缓冲 点Y写入
        内环数 数>实  360. N  数>实 / ♂ ∵ * ↑↓ 2.  /  +  偏移度 R N 星常量  转横坐标   内环数 2 * 2 +  曲线缓冲 点X写入
        内环数 数>实  360. N  数>实 / ♂ ∵ * ↑↓ 2.  /  +  偏移度 R N 星常量  转纵坐标   内环数 2 * 2 +  曲线缓冲 点Y写入       
  回环
  N 1+ 1
  ?循环  开始画笔路径[: 设备描述表
         0                          点X变换       0                 点Y变换  坐标定位: 设备描述表
         内环数 2 *          曲线缓冲 点X读取 内环数 2 *           曲线缓冲 点Y读取 画线到: 设备描述表
         内环数 2 * 1-       曲线缓冲 点X读取 内环数 2 * 1-        曲线缓冲 点Y读取 画线到: 设备描述表
         0                         点X变换       0                     点Y变换 画线到: 设备描述表
         ]结束画笔路径:  设备描述表
         2 画笔宽度:  颜色一
          颜色一   画线颜色: 设备描述表
          颜色一   画刷颜色: 设备描述表 
         勾画轮廓并填充: 设备描述表
         开始画笔路径[: 设备描述表
         0                             点X变换       0                      点Y变换  坐标定位: 设备描述表
         内环数 2 *             曲线缓冲 点X读取  内环数 2 *              曲线缓冲 点Y读取  画线到: 设备描述表
         内环数 2 * 1+  N 点修正 曲线缓冲 点X读取  内环数 2 * 1+  N 点修正  曲线缓冲 点Y读取  画线到: 设备描述表
         0                            点X变换         0                        点Y变换 画线到: 设备描述表
         ]结束画笔路径:  设备描述表
         2 画笔宽度: 颜色二
         颜色二   画线颜色: 设备描述表
         颜色二   画刷颜色: 设备描述表 
         勾画轮廓并填充: 设备描述表
   回环
    。
编 三角星
   覆盖绘图区
   250 250 200 0 粉红色 深红色 3 角星
   。
编 四角星
   覆盖绘图区
   250 250 200 0 粉红色 深红色 4 角星
   。


编 五角星
   覆盖绘图区
   250 250 200 0 粉红色 深红色 5 角星
   。
编 六角星
   覆盖绘图区
   250 250 200 0 粉红色 深红色 6 角星
   。
编 十角星
   覆盖绘图区
   250 250 200 0 粉红色 深红色 10 角星
   。


对象事件 绘制时:
        绘制时: 自源模板
    0 0 读大小: 自本身  浅灰色 区域填充: 设备描述表
        
         对象事件。

 


对象事件 定义路径:
        对象事件。

对象事件 关闭:
         关闭: 自源模板
         退出
         对象事件。
WM_CLOSE 触发时:
         关闭: 自源模板
         退出
         触发。

模板事件 接受命令:
       接受命令: 自源模板
       ∽  取低字
           如和 读标识: 新对象0 对应就  三角星
           而和 读标识: 新对象1 对应就  五角星
           而和 读标识: 新对象2 对应就  十角星
           而后 0
           模板事件。 
对象。
无名编  启动:     五角星绘制窗口
        。
执行无名词

 

 

 


此主题相关图片如下:五角星.jpg
按此在新窗口浏览图片

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
秦汉昌
  2楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1447 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2009/12/25 21:53:00

#include <windows.h>
#include <math.h>

#define    COUNT    5

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    MSG Message;
    HWND hWnd = NULL;
 TCHAR szAppName[] = TEXT("MainMenu");   
    WNDCLASS WndClass;

    WndClass.style = CS_HREDRAW| CS_VREDRAW;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hInstance = hInstance;
    WndClass.lpfnWndProc = WndProc;
    WndClass.lpszClassName = szAppName;
    WndClass.lpszMenuName = szAppName;

    if (!RegisterClass(&WndClass))
    {
        MessageBox(hWnd, TEXT("RegisterClass error"), TEXT("Error"), MB_OK);
        return 0;
    }

    hWnd=CreateWindow(szAppName,
        TEXT("菜单测试程序"), WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 500, 400,
        NULL, NULL, hInstance, NULL);

    ShowWindow(hWnd, nCmdShow);
    if( !UpdateWindow(hWnd))
  return 0;

    while(GetMessage(&Message,0,0,0))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return (int)(Message.wParam);
}

void InitPos(POINT *pPos)
{
    int i = 0;
    int r = 100;

    for (i=0; i<COUNT; ++i)
    {
        (pPos+i)->x = r * cos((((180 - 2 * (360/COUNT))/2) + ((360/COUNT) * i)) / 360.0 * 2 * 3.14);
        (pPos+i)->y = r * sin((((180 - 2 * (360/COUNT))/2) + ((360/COUNT) * i)) / 360.0 * 2 * 3.14);
        (pPos+i)->y *= -1;
    }
    (pPos+COUNT)->x = (pPos+0)->x;
    (pPos+COUNT)->y = (pPos+0)->y;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    static POINT iPos[COUNT+1];
    static int cx, cy;

    switch(iMessage)
    {
    case WM_CREATE:

        InitPos(iPos);
        return 0;

    case WM_PAINT:

        hdc = BeginPaint(hwnd, &ps);

        SetMapMode(hdc, MM_TEXT);
        SetViewportOrgEx(hdc, cx / 2, cy / 2, NULL);
        Polyline(hdc, iPos, COUNT+1);

        EndPaint(hwnd, &ps);

        return 0;

    case WM_SIZE:

        cx = LOWORD(lParam);
        cy = HIWORD(lParam);

        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    default:
        break;
    }
    return DefWindowProc(hwnd,iMessage,wParam,lParam);
}

 

 

 



此主题相关图片如下:五边形.jpg
按此在新窗口浏览图片

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
秦汉昌
  3楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1447 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2009/12/25 21:57:00

呵呵,有兴趣的朋友

 

可否用C语言做一个  通用的 多角星函数来

 

输入参数:X Y R 偏移度 颜色一 颜色二  N   

 

该函数就可以绘制 N角星


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
xjw01
  4楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2009/12/26 8:43:00


/*=========================
本函数在flash as2中调试通过
函数名称:duoJiaoXing
功能:绘制多角星
参数R:多角星顶点的外接圆半径
N:顶点个数
s:起始角度(相位角)
x0,y0:多角星的中心坐标

许剑伟2009.12.26上午
==========================*/
function duoJiaoXing( R, N, s, x0,y0){ //s单位是度
 var b = Math.PI/N, r = Math.cos(2*b)/Math.cos(b)*R; //r内径
 var x,y, x1,y1, a;
 for(var i=0;i<=2*N;i++){
   a = i%2 ? r : R;
   x = a*Math.cos(s)+x0;
   y = a*Math.sin(s)+y0;
   if(i){ //画局部三角形
     _root.lineStyle(1,0xFF0000,100);
     _root.moveTo(x0,y0);
     _root.lineTo(x1,y1);
     _root.lineTo(x, y);
   }
   x1 = x, y1 = y, s += b;
 }
};

duoJiaoXing(200,5,0, 200,200); //半径200,5角星,起画角度0,中心位置(200,200)
duoJiaoXing(200,6,0, 620,200); //半径200,6角星,起画角度0,中心位置(200,200)

 

//新建flash文件,将此代码复制到第1帧的Actions中即可



图片点击可在新窗口打开查看此主题相关图片如下:多角星.png
图片点击可在新窗口打开查看

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
xjw01
  5楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2009/12/26 9:15:00

C语言代码如下

 

#include "math.h"
void duoJiaoXing( double R, int N, double s, int x0,int y0){ //s单位是度
 double a, b = M_PI/N, r = cos(2*b)/cos(b)*R; //r内径
 int i, x,y, x1,y1;
 for(int i=0;i<=2*N;i++){
   a = i%2 ? r : R;
   x = a*cos(s)+x0;
   y = a*sin(s)+y0;
   if(i){ //画局部三角形
     Form1->Canvas->Pen->Color=0x0000FF;
     Form1->Canvas->MoveTo(x0,y0);
     Form1->Canvas->LineTo(x1,y1);
     Form1->Canvas->LineTo(x, y);
   }
   x1 = x, y1 = y, s += b;
 }
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 duoJiaoXing(200,5,0, 200,200); //半径200,5角星,起画角度0,中心位置(200,200)
 duoJiaoXing(200,6,0, 620,200); //半径200,6角星,起画角度0,中心位置(200,200)
}

 

//以上程序在C++Builder6.0中调试能过


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
xjw01
  6楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2009/12/26 9:18:00

不知楼主看到了没有,我在第4楼与第5楼的代码是很相似的,就是说,我要把flash的脚本改为C++,还是比较容易的。

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
xjw01
  7楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2009/12/26 10:08:00

我的理解:

 

第2楼,采用Polyline方法画线,它是一种常规的画线方法,在其它语言中一般也有这种方法。先把顶点序列保存到缓存数组,在用Polyline画线

第1楼,我没能看懂,也许方法与第2楼差不多吧。

第4楼第5楼,我不建缓存,直接moveto和lineto,这样比较省事。

我在寿星天文历中画地图和日食界线时,也是使用缓存的,然后一次性生成路径并显示。这样做与楼主的的思路是一样的,好处是,可以把算法实现的代码与界面画线显示的代码分开。我在编程时,总喜欢把“算法实现的代码”称为核心代码,其它部分称为界面代码。核心代码(寿星的天文算法)可以转换为其它语言,算法不必改。界面代码不可转为其它语言。在IE中,javascript通过DCOM元素控制界面,在flash则通过影片中的对象(如影片剪辑)控制界面,二者不是一回事,所以界面代码不能直接转换。因此,寿星的eph.js、eph0.js可以转,index.htm不可以转。

 

另外,我有一个疑问:

在其它语言中,对窗体的编程,一般有现成的模板可以使用,比如以下消息循环代码

    while(GetMessage(&Message,0,0,0))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }

在C++Builder或VC中,不一定要我们动手写,在集成环境中新建项目时,根据项目的类型,会自动创建的,包括窗体代码等。特别是针对activeX编程,接口代码更可怕,少则几百行,多则几千行,而这些,在集成环境中是自动创建的,不知汉编是如何解决这些问题的。

 

2楼给出window窗体的消息控制的代码,1楼好象没有,是不是说汉编已帮助我们添加了这部分代码,就象C++Builder或VC那样,而C++Builder和VC加入的代码,如果用户需要是可以修改的。去年,我写了一个指纹采集软件,就是通过控制消息,实现多窗体中各指纹机状态、事件的控制,所以,编译器在必要的时候要让程序员看到消息的传递代码,不需要的时候最好把这些代码“藏”起来,免得初学感到困难。

 

 

 


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
秦汉昌
  8楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1447 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2009/12/26 10:28:00

许老师,您的程序很精简,学习了

 

要能让自己有所进步,还得好好学习英、汉程序的相关知识

 

从这里看,汉编的不足表现在数据结构太简单,

 

要实现较复杂的算法,会让代码变得很罗索

 

呵呵,我要好好地闭关 修练了!!!!!


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
秦汉昌
  9楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1447 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2009/12/26 11:11:00

以下是引用xjw01在2009-12-26 10:08:00的发言:

我的理解:

 

第2楼,采用Polyline方法画线,它是一种常规的画线方法,在其它语言中一般也有这种方法。先把顶点序列保存到缓存数组,在用Polyline画线

第1楼,我没能看懂,也许方法与第2楼差不多吧。

第4楼第5楼,我不建缓存,直接moveto和lineto,这样比较省事。

我在寿星天文历中画地图和日食界线时,也是使用缓存的,然后一次性生成路径并显示。这样做与楼主的的思路是一样的,好处是,可以把算法实现的代码与界面画线显示的代码分开。我在编程时,总喜欢把“算法实现的代码”称为核心代码,其它部分称为界面代码。核心代码(寿星的天文算法)可以转换为其它语言,算法不必改。界面代码不可转为其它语言。在IE中,javascript通过DCOM元素控制界面,在flash则通过影片中的对象(如影片剪辑)控制界面,二者不是一回事,所以界面代码不能直接转换。因此,寿星的eph.js、eph0.js可以转,index.htm不可以转。

 

另外,我有一个疑问:

在其它语言中,对窗体的编程,一般有现成的模板可以使用,比如以下消息循环代码

    while(GetMessage(&Message,0,0,0))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }

在C++Builder或VC中,不一定要我们动手写,在集成环境中新建项目时,根据项目的类型,会自动创建的,包括窗体代码等。特别是针对activeX编程,接口代码更可怕,少则几百行,多则几千行,而这些,在集成环境中是自动创建的,不知汉编是如何解决这些问题的。

 

2楼给出window窗体的消息控制的代码,1楼好象没有,是不是说汉编已帮助我们添加了这部分代码,就象C++Builder或VC那样,而C++Builder和VC加入的代码,如果用户需要是可以修改的。去年,我写了一个指纹采集软件,就是通过控制消息,实现多窗体中各指纹机状态、事件的控制,所以,编译器在必要的时候要让程序员看到消息的传递代码,不需要的时候最好把这些代码“藏”起来,免得初学感到困难。

 

 

 

 一、 汉编的窗口确实比其它语言的代码要简化了,正如您说的“不需要的时候最好把这些代码“藏”起来,免得初学感到困难”,汉编是采用面向对象的模块化编程,每个模板、窗口的资源可以被其它窗口继承,在汉编中,三行可以定义一个窗口:

扩展对象  最简单的窗口  继承自  窗口对象模板

对象。

启动: 最简单的窗口

 

   关于窗口方面的理论,我没有见过汉编官族的系统阐述,但有,根据我的学习,我对它有几点认识:

 

第一、汉编窗口的代码包括两部分:

甲、窗口的定义:确切地说,窗口的定义由窗口对象模板来实现,我们在创建窗口时,只需继承窗口对象模板的属性、事件代码即可,当然,我们也可以很方便地改变窗口的大小、开始位置,开始尺寸、最大尺寸、背景颜色以及对象内的各种属性、事件等等

    定义代码如下:

 

   扩展对象  <窗口名>   继承自  窗口对象模板

   <  新增或 修改模板事件、属性的指令序列  >

   对象。

      我认为,汉编窗口的定义包括:属性和事件两部分,属性   和   事件 

在汉编中
   属性  与  事件
有什么区别呢?
1、属性的执行时机由系统规定
2、属性的名称也由系统规定
3、一个属性,具有一定的数据结构,我们要使性生效,只需某个属性的参数慨可

而事件则不同:
1、事件分系统事件和用户事件
   A、系统事件由系统规定执行时机
   B、用户事件由用户规定执行时机
   C、系统事件的名称由系统规定
   D、用户事件的名称由用户规定
2、事件 与属性不同,系统可以由一每每不列的指令构成,不像属性,一般只有参数,具体指令,在系统内统一封装

思考:
   为什么汉编窗口属性与事件 的功能分成两种形式呢?
我想,
1、由于汉编是基于WIN32的,要建窗口,必须调用 API

而属性,就是对API的规范封闭,使WIN窗口变成汉编习惯 的形式
2、属性是对窗口的基本要素的封装、而事件 则是对窗口功能 的扩充,事件才是汉 编指令的实现场所,事件的指令序列从一定意义上讲,已经脱离了aPI,当然可以用API,事件是汉编的 功能实现方式
汉语编程的语言组成可分为:
1、词:
   包括系统定义词和自定义词
2、属性:
   即系统赋予某个对象的基本特征
3、事件:
   即由一个或多个词组成的指令序列,它一般在模板或窗口中定义,对所有对象或模板开放
我们习惯将。系统定义的词,称作 系统词
将 用户定义的词,称为:  新词

系统定义词

用户定义词
在使用上,并没有什么等级区别,但要使用  用户定义词,必须先装载  某用户词,方可使用,我们也可以通过重建系统,将用户词装入系统,使之成为系统的一部分
但从源码看
用户定义词是系统词的组合

 

 

 

乙、窗口的启动: 

    窗口定义后,只一段代码,我必须在需要的时候启动它,指令如下:

   启动: <窗口名>

二、我所感觉的汉编语言对算法的益处 (下楼继续)

[此贴子已经被作者于2009-12-26 14:23:35编辑过]

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
秦汉昌
  10楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1447 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2009/12/26 14:10:00

二、汉编的算法表达

       在算法表达上,汉编是可以做到尽量少用变量和缓冲的,这是由汉编的数摞结构所决定的,因为,数摞可以灵活地操作数据,很容易改变数据在数摞上的顺序和并进行运算,并且通过暗摞来暂存某些数据,所以汉编可以做到尽量少用变量和缓冲,由数摞直接完成数据处理。上面的五角星程序,是按传统的编程习惯编写的,也没有考虑程序的精简问题,现在,通过许老师的算法启发,我也对上面的五角星程序做了些修改,没有用缓冲来保存 坐标点:

 

 


255 9 52 RGB 新颜色 粉红色
155 6 36 RGB 新颜色 深红色

扩展对象 五角星绘制窗口  继承自 窗口对象模板

按钮控制 新对象0
按钮控制 新对象1
按钮控制 新对象2

\ 窗口内过程、事件、变量、实例对象、缓冲等
 
属性 窗口标题:
     编字串" 五角星绘制"
     属性。
属性 开始尺寸:
     500 500
     属性。
属性 开始位置:
     自动居中: 自本身
     属性。


0  给  横坐标
0  给  纵坐标


编 点X变换
  横坐标     +     。

编 点Y变换
  纵坐标 ↑↓ -    。  

 


  210  给  绘图区

编 覆盖绘图区
   浅灰色  画线颜色: 设备描述表
    浅灰色  画刷颜色: 设备描述表
    0  点X变换  0  点Y变换
    绘图区  填充圆: 设备描述表
   。


对象事件 初始时:
         本身的 启动: 新对象0
         435 11 60 23 定位: 新对象0
         字串" 三角星"   置控制对象标题: 新对象0
         本身的 启动: 新对象1
         435 46 60 23 定位: 新对象1
         字串" 五角星"   置控制对象标题: 新对象1
         本身的 启动: 新对象2
         435 76 60 23 定位: 新对象2
         字串" 十角星"   置控制对象标题: 新对象2
          \ 窗口初始事件: 不包含 '编' '变量:' '为'等,直接输入执行的动作词
         对象事件。

编 转弧度 π 180.0 / * 。

编 转角度 180.0 π / * 。

 

编 回始点  ( N --- )
   { N \ -- }
 ♂ N  = 就 ♀ 0 然后
 。


编 星常量   (  R  N  --- )
   { \ R0 N0 -- } 数>实  写入  N0 数>实  写入  R0
    N0 3.0 >
   就    R0  360.00 N0 4.00 * /  转弧度  FCOS  *
             360.00 N0 2.00 * /  转弧度  FTAN  *
         R0  360.00 N0 4.00 * /  转弧度  FSIN  *  -
   否则   R0 3.0 /
   然后
   。

编 求实数
   ♂ 属性值 0= 就 数>实  然后  。

编 求点坐标    ( R 度数   --- )
        求实数 ↑↓ 求实数 ↑↓ 转弧度
         ♂  FCOS  2 §   *  实>数 点X变换
         ∵  FSIN        *  实>数 点Y变换    。


编 角星   ( X Y R 偏移度 颜色一 颜色二  N  --- )
         { X Y R 偏移度 颜色一 颜色二 N \ 五星色 -- }  0  写入  五星色
         X        写入 横坐标 Y        写入  纵坐标
  N 0
  ?循环  开始画笔路径[: 设备描述表
         0                          点X变换       0                               点Y变换  坐标定位: 设备描述表
         R          内环数 数>实  360. N  数>实 /      *                偏移度 求实数  +  求点坐标 画线到: 设备描述表
         R N 星常量  内环数 数>实  360. N  数>实 / ♂ ∵ * ↑↓ 2.  /  +  偏移度  求实数  +  求点坐标 画线到: 设备描述表
         0                         点X变换       0                                    点Y变换 画线到: 设备描述表
         ]结束画笔路径:  设备描述表
         2 画笔宽度:  颜色一
          颜色一   画线颜色: 设备描述表
          颜色一   画刷颜色: 设备描述表 
         勾画轮廓并填充: 设备描述表
         开始画笔路径[: 设备描述表
         0                          点X变换       0                                   点Y变换  坐标定位: 设备描述表
         R  内环数 1+ N 回始点  数>实  360. N  数>实 /      *                偏移度 求实数 + 求点坐标 画线到: 设备描述表
         R N 星常量  内环数     数>实  360. N  数>实 / ♂ ∵ * ↑↓ 2.  /  +  偏移度 求实数 +  求点坐标 画线到: 设备描述表
         0                         点X变换       0                                        点Y变换 画线到: 设备描述表
        ]结束画笔路径:  设备描述表
         2 画笔宽度: 颜色二
         颜色二   画线颜色: 设备描述表
         颜色二   画刷颜色: 设备描述表 
         勾画轮廓并填充: 设备描述表
   回环
    。

编 三角星
   覆盖绘图区
   250 250 200 0 粉红色 深红色 3 角星
   。
编 四角星
   覆盖绘图区
   250 250 200 0 粉红色 深红色 4 角星
   。


编 五角星
   覆盖绘图区
   250 250 200 0 粉红色 深红色 5 角星
   。
编 六角星
   覆盖绘图区
   250 250 200 0 粉红色 深红色 6 角星
   。
编 十角星
   覆盖绘图区
   250 250 200 0 粉红色 深红色 10 角星
   。


对象事件 绘制时:
        绘制时: 自源模板
    0 0 读大小: 自本身  浅灰色 区域填充: 设备描述表
        
         对象事件。

 


对象事件 定义路径:
        对象事件。

对象事件 关闭:
         关闭: 自源模板
         退出
         对象事件。
WM_CLOSE 触发时:
         关闭: 自源模板
         退出
         触发。

模板事件 接受命令:
       接受命令: 自源模板
       ∽  取低字
           如和 读标识: 新对象0 对应就  三角星
           而和 读标识: 新对象1 对应就  五角星
           而和 读标识: 新对象2 对应就  十角星
           而后 0
           模板事件。 
对象。
无名编  启动:     五角星绘制窗口
        。
执行无名词


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
总数 16 1 2 下一页

返回版面帖子列表

[原创]用汉编绘五角星(附英文程序比较)








签名