MIDP1.0中实现三角形的填充

    由于开发的适应性需要,J2ME程序员在很多时候不能使用MIDP2.0进行开发。但是MIDP1.0的功能和2.0相差很多,许多实用的函数都没有提供。这需要程序员自己实现。本文介绍了一个Canvas中的实用的函数,用来在Canvas中填充三角形区域。

  import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Command;import javax.microedition.lcdui.CommandListener;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.Graphics;

public class Triangle extends Canvas implements CommandListener {    private Graphics g;        public Triangle(){            }

    protected void paint(Graphics arg0) {        g = arg0;        g.setColor(0xffffff);        g.fillRect(0,0,this.getWidth(),this.getHeight());        g.setColor(0x000000);        fillTriangle(5,40,100,10,200,200);    }

    /**     * 条件:点(x0,y0),(x1,y1),(x2,y2)组成三角形。     * 解决办法: 设直线L过点(x1,y1),(x2,y2)两个点     * (x3,y3)是直线L上的点,从(x0,y0)画线到(x3,y3)。     * 只要我们取到直线L上面的所有显示的象素点,就可以实现三角形的填充。     *      * 问题:直线L有两种状态,竖直和倾斜(包括水平),竖直状态,我们很容易解决。     * 倾斜状态,我们需要求得直线的斜率,这看似要使用浮点数,但是我们可以使用整数解决。     * 因为当直线(线段)上的两个端点(x1,y1),(x2,y2)的横坐标x1!=x2时     * 即(x1-x2的绝对值大于等于1),     * 纵坐标的差值y2-y1最大是屏幕的高。所以(y1-y2)/(x1-x2)的值最大不超过屏幕的高度值。     * 这个值和Integer.Max_Value相差很多。这样我们可以把这个斜率放大1000倍之后使用。     * 这是可以斜率的精度的要求的。     */    private void fillTriangle(int x0, int y0, int x1, int y1, int x2, int y2) {        int temp,x3,y3;        if(y1>y2){//保证y2>y1,便于计算,这只是交换两个点的reference,不影响结果。            temp=x1;            x1=x2;            x2=temp;            temp=y1;            y1=y2;            y2=temp;        }                   if(x1==x2){                        x3=x1;            y3=y1+1;            do{                g.drawLine(x0,y0,x3,y3);                y3++;            }while(y3<y2);        }else{            if(y1==y2){                if(x1>x2){                    temp=x1;                    x1=x2;                    x2=temp;                    temp=y1;                    y1=y2;                    y2=temp;                                    }                x3=x1;                y3=y1;                do{                    g.drawLine(x0,y0,x3,y3);                    x3++;                }while(x3<x2);            }else{                int k=(y1-y2)*1000/(x1-x2);//斜率,放大了1000倍                System.out.println("k is "+k);                y3=y1+1;                x3=(y3-y1)*1000/k+x1;                do{                    g.drawLine(x0,y0,x3,y3);                    y3++;                    x3=(y3-y1)*1000/k+x1;                }while(y3<y2);            }                    }    }     public void commandAction(Command arg0, Displayable arg1) {

    }

}

这份代码没有进行三个点是否可以组成三角形的校验。由于实现的机制是从一个点到对应的线上的点画线,所以线的端点不要使用钝角的顶点,因为这样可能出现填充不满的情况。当然,这可以在函数内解决,但是,我一时还没有找到合适的方法。

代码经过测试了。但是,我的测试可能不完善,使用之前你再测试一下。代码的效率不用担心,经过检验,画图使用大概0.016秒。使用循环100次,得到的结果。

这个填充三角形的方法虽然在思路上是正确的,但是还有很多不足之处,希望大家可以修改好,然后把修改之后的函数告诉我。我也小小的“开源”一下,呵呵。

MSN:cuilichen@hotmail.com

时间: 2025-01-16 18:05:13

MIDP1.0中实现三角形的填充的相关文章

.NET(C#) Internals: 以一个数组填充的例子初步了解.NET 4.0中的并行(一)

引言 随着CPU多核的普及,编程时充分利用这个特性越显重要.本文首先用传统的嵌套循环进行数组填充,然后用.NET 4.0中的System.Threading.Tasks提供的Parallel Class来并行地进行填充(当然这里也用到嵌套循环),通过对比发现其中差异.主要内容如下: 通常的数组填充 并行的组数填充 性能比较 System.Threading.Tasks分析,这个将在续篇.NET(C#) Internals: 以一个数组填充的例子初步了解.NET 4.0中的并行(二)中介绍 1.通

Fireworks4.0中虚线效果制作技巧全攻略

攻略|技巧 Fireworks是一款针对网页图形设计的软件,虽然比起Photoshop等专业级的绘图软件来,它的功能还算不上很强大,但只要多用巧用,细心钻研,它的功能还是能满足网页图象设计的各种要求的. 无论在网页设计还是其他平面设计中,绘制虚线是一项应用比较广泛的技巧.在Fireworks4.0中,利用stroke面板,可以轻松的绘制多种多样的线条样式,但是stroke面板中并没有提供直接绘制虚线的选项,以前笔者也曾为此困惑过,经过一番钻研,终于发现了绘制虚线的一些诀窍,不敢独享,贡献出来给各

抢先试用ASP.NET 2.0中的新型安全控件

asp.net|安全|控件 一. 引言 与ASP.NET 2.0一同上市的有几个新的安全控件-它们位于工具的Login选项卡中(见图1)-这些控件大大简化了Web开发人员的工作.通过使用这些新的安全控件,现在你可以执行例如用户登录.注册.口令改变等的任务:而且,为此做出的努力仅是拖放相应的控件到你的Web表单上去.在本文中,我将向你展示怎样使用这些新控件来实现用户认证. 首先,让我们探索一下LoginView.LoginStatus和LoginName三个控件的使用.首先,让我们使用Visual

理解并扩展 ASP.NET 2.0 中的站点导航系统

asp.net|导航|站点 摘要:ASP.NET 2.0 站点导航系统构建于一个功能强大.灵活的体系结构之上,设计这样的体系结构是为了使其具有可扩展性.本文探究站点提供程序的体系结构并提供一个示例提供程序,该提供程序将文件系统公开为站点导航的数据源,从而替代了标准的 Web.sitemap XML 文件. 简介 大多数 web 站点采用可视化导航的某种形式来帮助用户轻松地浏览站点,以及查找他们所需的信息和 Web 页.尽管不同站点之间的感观效果千差万别,但是通常会使用相同的基本元素 - 以导航栏

ASP.NET 2.0 中的窗体身份验证

asp.net 概述 窗体身份验证使用用户登录到站点时创建的身份验证票,然后在整个站点内跟踪该用户.窗体身份验证票通常包含在一个 Cookie 中.然而,ASP.NET 2.0 版支持无 Cookie 窗体身份验证,结果是将票证传入查询字符串中. 如果用户请求一个需要经过身份验证的访问的页,且该用户以前没有登录过该站点,则该用户重定向到一个配置好的登录页.该登录页提示用户提供凭据(通常是用户名和密码).然后,将这些凭据传递给服务器并针对用户存储(如 SQL Server 数据库)进行验证.在 A

ASP.NET 2.0中发送电子邮件剖析之一

asp.net 一.简介 如今,电子邮件已经成为一种无所不在.异步通知和分布式的消息系统.存在许多web开发场所:其中,服务器端代码都需要生成一个电子邮件并且把它发送给指定的接收者.该电子邮件可以被发送给网点中的一些用户,通知他们有关于他们的新建用户帐户,提醒他们忘记的口令,或以邮件形式提交给他们一个清单.当然,这也可以是针对web开发者或站点管理员,提供给他们有关一个刚刚公开的未处理的异常或用户回馈的消息. 幸好,ASP.NET使得发送电子邮件非常轻松..NET框架版本1.x在System.W

在ASP.NET 2.0中使用样式、主题和皮肤

asp.net ASP.NET 2.0的主题和皮肤特性使你能够把样式和布局信息存放到一组独立的文件中,总称为主题(Theme).接下来我们可以把这个主题应用到任何站点,用于改变该站点内的页面和控件的外观和感觉.通过改变主题的内容,而不用改变站点的单个页面,就可以轻易地改变站点的样式.主题也可以在开发者之间共享. ASP.NET包含了大量的用于定制应用程序的页面和控件的外观和感觉的特性.控件支持使用Style(样式)对象模型来设置格式属性(例如字体.边框.背景和前景颜色.宽度.高度等等).控件也支

ASP.NET 2.0中保证应用程序的安全

asp.net|安全|程序 成员和角色管理器提供程序--现在ASP.NET 2.0包含了内建的成员和角色管理服务.由于这些服务都是提供程序驱动的(provider-driven),你可以轻易地变更它,或者用自定义实现来代替它. 登录控件--新的登录控件为站点的基于认证和授权的UI(例如登录窗体.创建用户窗体.密码取回.已登录用户或角色的定制UI)提供了基本模块.这些控件利用ASP.NET 2.0中的内建的成员和角色服务与站点所定义的用户和角色信息交互操作. 大多数Web应用程序的一个重要的部分是

探讨ASP.NET 2.0中的Web控件改进技术

asp.net|web|控件 ASP.NET 2.0并没有抛弃1.1版本中的任何现有控件,而是增加了一组新的控件;同时还引入了若干新的控件开发技术.本系列文章将对这些内容展开全面探讨. 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩;但是,你是否了解到有关定制Web控件开发方面的重大变化?这正是我在本文中所想讨论的.如果你已经从事于控件开发,那么,我想本文所描述的ASP.NET 2.0中的新的改进特征会立即应用于