﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-hyljava-随笔分类-HTML5</title><link>http://www.blogjava.net/hyljava/category/53420.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 23 Nov 2013 23:12:36 GMT</lastBuildDate><pubDate>Sat, 23 Nov 2013 23:12:36 GMT</pubDate><ttl>60</ttl><item><title>四海兴唐课程辅导平台</title><link>http://www.blogjava.net/hyljava/archive/2013/11/23/406728.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Sat, 23 Nov 2013 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2013/11/23/406728.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/406728.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2013/11/23/406728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/406728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/406728.html</trackback:ping><description><![CDATA[<div>四海兴唐课程辅导平台<br /><a href="http://fd.itedu-g.cn/login.php">http://fd.itedu-g.cn/login.php</a></div><img src ="http://www.blogjava.net/hyljava/aggbug/406728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2013-11-23 20:52 <a href="http://www.blogjava.net/hyljava/archive/2013/11/23/406728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>html锚点&amp;jsp锚点</title><link>http://www.blogjava.net/hyljava/archive/2013/09/18/404222.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Wed, 18 Sep 2013 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2013/09/18/404222.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/404222.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2013/09/18/404222.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/404222.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/404222.html</trackback:ping><description><![CDATA[<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">经过试验后发现HTML锚点在JSP中并不兼容。两者表示锚点的方法有所不同</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">HTML锚点</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;a href="#1"&gt;goto1&lt;/a&gt;</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">.</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">.</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">.</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">.</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;a name="1"&gt;111&lt;/a&gt;</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">这样从goto1可以定位到111</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">JSP锚点</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;a href="javascript:void(0)" onclick="document.getElementById('1').scrollIntoView();"&gt;goto1&lt;/a&gt;</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">。</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">。</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">。</p>
<p style="text-align: left; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&lt;a&nbsp;id="1"&gt;1111&lt;/a&gt;</p><img src ="http://www.blogjava.net/hyljava/aggbug/404222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2013-09-18 16:49 <a href="http://www.blogjava.net/hyljava/archive/2013/09/18/404222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML to PDF  </title><link>http://www.blogjava.net/hyljava/archive/2013/07/10/401390.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Wed, 10 Jul 2013 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2013/07/10/401390.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/401390.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2013/07/10/401390.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/401390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/401390.html</trackback:ping><description><![CDATA[HTML to PDF conversion for your website or application<br /><br /><a href="http://www.htm2pdf.co.uk/">http://www.htm2pdf.co.uk/</a><img src ="http://www.blogjava.net/hyljava/aggbug/401390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2013-07-10 10:41 <a href="http://www.blogjava.net/hyljava/archive/2013/07/10/401390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>miniui超级强悍UI</title><link>http://www.blogjava.net/hyljava/archive/2013/05/27/399823.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Mon, 27 May 2013 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2013/05/27/399823.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/399823.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2013/05/27/399823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/399823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/399823.html</trackback:ping><description><![CDATA[<div>miniui超级强悍UI<br /><a href="http://www.miniui.com/demo/#src=messagebox.html">http://www.miniui.com/demo/#src=messagebox.html</a></div><img src ="http://www.blogjava.net/hyljava/aggbug/399823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2013-05-27 15:41 <a href="http://www.blogjava.net/hyljava/archive/2013/05/27/399823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebSocket</title><link>http://www.blogjava.net/hyljava/archive/2013/03/19/396650.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Tue, 19 Mar 2013 04:54:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2013/03/19/396650.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/396650.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2013/03/19/396650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/396650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/396650.html</trackback:ping><description><![CDATA[<div><p style="margin-bottom:0pt; margin-top:0pt; "><font face="宋体">&nbsp;</font></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">WebSocket是一种比HTTP协议更加高效的网络传输协议，它有效地减少了HTTP头中的冗余信息和网络延时，能够提供客户端-服务器和服务器-客户端的双通道实时通信，同时具有很好的安全机制。基于WebSocket的URL通常以WS://...开头，类似于HTTPS，安全的WebSocket连接URL通常以WSS://...开头。要实现WebSocket通信，需要客户端浏览器支持WebSocket，服务器端也必须支持WebSocket。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">WebSocket还具有广播功能，当有多个监听者连接时，广播服务器发送的消息都可被接收到。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">2.浏览器支持检测</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">function&nbsp;loadDemo()&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">{&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">if&nbsp;(window.WebSocket)&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">{&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">document.getElementById("support").innerHTML&nbsp;=&nbsp;"HTML5&nbsp;WebSocket&nbsp;is&nbsp;supported&nbsp;in&nbsp;your&nbsp;browser.";&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">}&nbsp;else&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">{&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">document.getElementById("support").innerHTML&nbsp;=&nbsp;"HTML5&nbsp;WebSocket&nbsp;is&nbsp;not&nbsp;supported&nbsp;in&nbsp;your&nbsp;browser.";&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">}&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">3.WebSocket对象</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">WebSocket在DOM中是window对象的子对象，它具有：</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&#8226;WebSocket(url)构造函数。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&#8226;readyState。只读属性，其值可以是CONNECTING（0），OPEN（1），CLOSED（3）。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&#8226;boolean&nbsp;send(in&nbsp;DOMString&nbsp;data)和void&nbsp;close()两个方法，分别用于发送消息和关闭WebSocket连接</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&#8226;onopen,&nbsp;onmessage,&nbsp;和onclosee三个事件属性，分别对open,&nbsp;message和close三个WebSocket事件。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">3.使用WebSocket的步骤</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//建立连接</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">url&nbsp;=&nbsp;"ws://localhost:8080/echo";&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">w&nbsp;=&nbsp;new&nbsp;WebSocket(url);&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//事件监听</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">w.onopen&nbsp;=&nbsp;function()&nbsp;{&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">log("open");&nbsp;w.send("thank&nbsp;you&nbsp;for&nbsp;accepting&nbsp;this&nbsp;websocket&nbsp;request");&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">}&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">w.onmessage&nbsp;=&nbsp;function(e)&nbsp;{&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">log(e.data);&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">}&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">w.onclose&nbsp;=&nbsp;function(e)&nbsp;{&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">log("closed");&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//发送消息</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">document.getElementById("sendButton").onclick&nbsp;=&nbsp;function()&nbsp;{&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">w.send(document.getElementById("inputMessage").value);&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//关闭连接。一般情况下不关闭，以保持实时通信</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">w.close();</span></p></div><img src ="http://www.blogjava.net/hyljava/aggbug/396650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2013-03-19 12:54 <a href="http://www.blogjava.net/hyljava/archive/2013/03/19/396650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在HTML5的Canvas上绘制椭圆的几种方法</title><link>http://www.blogjava.net/hyljava/archive/2013/03/19/396649.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Tue, 19 Mar 2013 04:50:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2013/03/19/396649.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/396649.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2013/03/19/396649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/396649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/396649.html</trackback:ping><description><![CDATA[<div><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">在HTML5的Canvas上绘制椭圆的几种方法</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">概述</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;HTML5中的Canvas并没有直接提供绘制椭圆的方法，下面是对几种绘制方法的总结。各种方法各有优缺，视情况选用。各方法的参数相同：</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">context为Canvas的2D绘图环境对象，</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">x为椭圆中心横坐标，</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">y为椭圆中心纵坐标，</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">a为椭圆横半轴长，</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">b为椭圆纵半轴长。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">参数方程法</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;该方法利用椭圆的参数方程来绘制椭圆</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; ">&nbsp;</p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//-----------用参数方程绘制椭圆---------------------</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//函数的参数x,y为椭圆中心；a,b分别为椭圆横半轴、</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//纵半轴长度，不可同时为0</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//该方法的缺点是，当lineWidth较宽，椭圆较扁时</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//椭圆内部长轴端较为尖锐，不平滑，效率较低</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">function&nbsp;ParamEllipse(context,&nbsp;x,&nbsp;y,&nbsp;a,&nbsp;b)</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;//max是等于1除以长轴值a和b中的较大者</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;//i每次循环增加1/max，表示度数的增加</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;//这样可以使得每次循环所绘制的路径（弧线）接近1像素</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;var&nbsp;step&nbsp;=&nbsp;(a&nbsp;&gt;&nbsp;b)&nbsp;?&nbsp;1&nbsp;/&nbsp;a&nbsp;:&nbsp;1&nbsp;/&nbsp;b;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.beginPath();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.moveTo(x&nbsp;+&nbsp;a,&nbsp;y);&nbsp;//从椭圆的左端点开始绘制</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;2&nbsp;*&nbsp;Math.PI;&nbsp;i&nbsp;+=&nbsp;step)</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//参数方程为x&nbsp;=&nbsp;a&nbsp;*&nbsp;cos(i),&nbsp;y&nbsp;=&nbsp;b&nbsp;*&nbsp;sin(i)，</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//参数为i，表示度数（弧度）</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.lineTo(x&nbsp;+&nbsp;a&nbsp;*&nbsp;Math.cos(i),&nbsp;y&nbsp;+&nbsp;b&nbsp;*&nbsp;Math.sin(i));</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.closePath();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.stroke();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">均匀压缩法</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;这种方法利用了数学中的均匀压缩原理将圆进行均匀压缩为椭圆，理论上为能够得到标准的椭圆.下面的代码会出现线宽不一致的问题，解决办法看5楼simonleung的评论。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; ">&nbsp;</p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//------------均匀压缩法绘制椭圆--------------------</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//其方法是用arc方法绘制圆，结合scale进行</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//横轴或纵轴方向缩放（均匀压缩）</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//这种方法绘制的椭圆的边离长轴端越近越粗，长轴端点的线宽是正常值</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//边离短轴越近、椭圆越扁越细，甚至产生间断，这是scale导致的结果</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//这种缺点某些时候是优点，比如在表现环的立体效果（行星光环）时</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//对于参数a或b为0的情况，这种方法不适用</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">function&nbsp;EvenCompEllipse(context,&nbsp;x,&nbsp;y,&nbsp;a,&nbsp;b)</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.save();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;//选择a、b中的较大者作为arc方法的半径参数</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;var&nbsp;r&nbsp;=&nbsp;(a&nbsp;&gt;&nbsp;b)&nbsp;?&nbsp;a&nbsp;:&nbsp;b;&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;var&nbsp;ratioX&nbsp;=&nbsp;a&nbsp;/&nbsp;r;&nbsp;//横轴缩放比率</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;var&nbsp;ratioY&nbsp;=&nbsp;b&nbsp;/&nbsp;r;&nbsp;//纵轴缩放比率</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.scale(ratioX,&nbsp;ratioY);&nbsp;//进行缩放（均匀压缩）</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.beginPath();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;//从椭圆的左端点开始逆时针绘制</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.moveTo((x&nbsp;+&nbsp;a)&nbsp;/&nbsp;ratioX,&nbsp;y&nbsp;/&nbsp;ratioY);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.arc(x&nbsp;/&nbsp;ratioX,&nbsp;y&nbsp;/&nbsp;ratioY,&nbsp;r,&nbsp;0,&nbsp;2&nbsp;*&nbsp;Math.PI);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.closePath();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.stroke();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.restore();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">三次贝塞尔曲线法一</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;三次贝塞尔曲线绘制椭圆在实际绘制时是一种近似，在理论上也是一种近似。&nbsp;但因为其效率较高，在计算机矢量图形学中，常用于绘制椭圆，但是具体的理论我不是很清楚。&nbsp;近似程度在于两个控制点位置的选取。这种方法的控制点位置是我自己试验得出，精度还可以.</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; ">&nbsp;</p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//---------使用三次贝塞尔曲线模拟椭圆1---------------------</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//此方法也会产生当lineWidth较宽，椭圆较扁时，</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//长轴端较尖锐，不平滑的现象</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">function&nbsp;BezierEllipse1(context,&nbsp;x,&nbsp;y,&nbsp;a,&nbsp;b)</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;//关键是bezierCurveTo中两个控制点的设置</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;//0.5和0.6是两个关键系数（在本函数中为试验而得）</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;var&nbsp;ox&nbsp;=&nbsp;0.5&nbsp;*&nbsp;a,</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oy&nbsp;=&nbsp;0.6&nbsp;*&nbsp;b;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.save();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.translate(x,&nbsp;y);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.beginPath();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;//从椭圆纵轴下端开始逆时针方向绘制</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.moveTo(0,&nbsp;b);&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.bezierCurveTo(ox,&nbsp;b,&nbsp;a,&nbsp;oy,&nbsp;a,&nbsp;0);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.bezierCurveTo(a,&nbsp;-oy,&nbsp;ox,&nbsp;-b,&nbsp;0,&nbsp;-b);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.bezierCurveTo(-ox,&nbsp;-b,&nbsp;-a,&nbsp;-oy,&nbsp;-a,&nbsp;0);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.bezierCurveTo(-a,&nbsp;oy,&nbsp;-ox,&nbsp;b,&nbsp;0,&nbsp;b);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.closePath();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.stroke();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context.restore();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">三次贝塞尔曲线法二</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;这种方法是从StackOverFlow中一个帖子的回复中改变而来，精度较高，也是通常用来绘制椭圆的方法.</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; ">&nbsp;</p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//---------使用三次贝塞尔曲线模拟椭圆2---------------------</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//此方法也会产生当lineWidth较宽，椭圆较扁时</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//，长轴端较尖锐，不平滑的现象</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//这种方法比前一个贝塞尔方法精确度高，但效率稍差</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">function&nbsp;BezierEllipse2(ctx,&nbsp;x,&nbsp;y,&nbsp;a,&nbsp;b)</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;var&nbsp;k&nbsp;=&nbsp;.5522848,</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;ox&nbsp;=&nbsp;a&nbsp;*&nbsp;k,&nbsp;//&nbsp;水平控制点偏移量</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;oy&nbsp;=&nbsp;b&nbsp;*&nbsp;k;&nbsp;//&nbsp;垂直控制点偏移量</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;ctx.beginPath();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;//从椭圆的左端点开始顺时针绘制四条三次贝塞尔曲线</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;ctx.moveTo(x&nbsp;-&nbsp;a,&nbsp;y);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;ctx.bezierCurveTo(x&nbsp;-&nbsp;a,&nbsp;y&nbsp;-&nbsp;oy,&nbsp;x&nbsp;-&nbsp;ox,&nbsp;y&nbsp;-&nbsp;b,&nbsp;x,&nbsp;y&nbsp;-&nbsp;b);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;ctx.bezierCurveTo(x&nbsp;+&nbsp;ox,&nbsp;y&nbsp;-&nbsp;b,&nbsp;x&nbsp;+&nbsp;a,&nbsp;y&nbsp;-&nbsp;oy,&nbsp;x&nbsp;+&nbsp;a,&nbsp;y);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;ctx.bezierCurveTo(x&nbsp;+&nbsp;a,&nbsp;y&nbsp;+&nbsp;oy,&nbsp;x&nbsp;+&nbsp;ox,&nbsp;y&nbsp;+&nbsp;b,&nbsp;x,&nbsp;y&nbsp;+&nbsp;b);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;ctx.bezierCurveTo(x&nbsp;-&nbsp;ox,&nbsp;y&nbsp;+&nbsp;b,&nbsp;x&nbsp;-&nbsp;a,&nbsp;y&nbsp;+&nbsp;oy,&nbsp;x&nbsp;-&nbsp;a,&nbsp;y);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;ctx.closePath();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;ctx.stroke();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">光栅法</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;这种方法可以根据Canvas能够操作像素的特点，利用图形学中的基本算法来绘制椭圆。&nbsp;例如中点画椭圆算法等。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;其中一个例子是园友&#8220;豆豆狗&#8221;的一篇博文&#8220;HTML5&nbsp;Canvas&nbsp;提高班（一）&nbsp;&#8212;&#8212;&nbsp;光栅图形学（1）中点画圆算法&#8221;。这种方法由于比较&#8220;原始&#8221;，灵活性大，效率高，精度高，但要想实现一个有使用价值的绘制椭圆的函数，比较复杂。比如，要当线宽改变时，算法就复杂一些。虽然是画圆的算法，但画椭圆的算法与之类似，可以参考下。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; ">&nbsp;</p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">总结</span></p><p style="margin-bottom:0pt; margin-top:0pt; ">&nbsp;</p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;基本上所有的方法都不可能达到100%精确，因为受显示器分辨率的限制。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;其实最好的方法应该是arc()+scale()。canvas绘图库KineticJS就是用的这种方法。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;在其他绘图软件中，不像HTML5的canvas那样提供固有的arc()+scale()方法，通常用贝塞尔曲线模拟近似椭圆，无论是几条贝塞尔曲线都是近似而已。关于用贝塞尔曲线模拟椭圆，可以参考这份资料：Drawing&nbsp;an&nbsp;elliptical&nbsp;arc&nbsp;using&nbsp;polylines,&nbsp;quadratic&nbsp;or&nbsp;cubic&nbsp;Bezier&nbsp;curves。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;由于arc()+scale()是浏览器已经实现的方法，理论上精度最高，所以从效率、精确度和简单易用程度上来讲，都是最佳的。</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;在用arc()+scale()绘制完椭圆后，context.stroke()和&nbsp;context.restore()两个方法调用的先后顺序不同，产生的结果会很有意思的。通常应该先restore()再stroke()。&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">Demo</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">下面是除光栅法之外，几个绘制椭圆函数的演示，演示代码如下：</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&lt;div&nbsp;id="CanvasWrap"&nbsp;style="&nbsp;background:#fff;&nbsp;width:&nbsp;600px;&nbsp;height:&nbsp;600px;&nbsp;border:&nbsp;1px&nbsp;solid&nbsp;black;"&gt;&lt;/div&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&lt;script&nbsp;type="text/javascript"&gt;//&nbsp;&lt;![CDATA[</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;var&nbsp;canvas,</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;var&nbsp;div&nbsp;=&nbsp;document.getElementById("CanvasWrap");</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;div.innerHTML&nbsp;=&nbsp;"";</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;canvas&nbsp;=&nbsp;document.createElement("canvas");</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;canvas.style.width&nbsp;=&nbsp;"600px"</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;canvas.style.height&nbsp;=&nbsp;"600px"</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;canvas.width&nbsp;=&nbsp;600;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;canvas.height&nbsp;=&nbsp;600;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;context&nbsp;=&nbsp;canvas.getContext("2d");</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;div.appendChild(canvas);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;function&nbsp;execDraw()</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//解决Chrome下的线宽小于等于1的问题</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.lineWidth&nbsp;=&nbsp;1.1;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.strokeStyle="black"</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParamEllipse(context,&nbsp;130,&nbsp;80,&nbsp;50,&nbsp;50);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//圆</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParamEllipse(context,&nbsp;130,&nbsp;80,&nbsp;100,&nbsp;20);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//椭圆</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EvenCompEllipse(context,&nbsp;130,&nbsp;200,&nbsp;50,&nbsp;50);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//圆</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EvenCompEllipse(context,&nbsp;130,&nbsp;200,&nbsp;100,&nbsp;20);&nbsp;&nbsp;&nbsp;&nbsp;//椭圆</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BezierEllipse1(context,&nbsp;470,&nbsp;80,&nbsp;50,&nbsp;50);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//圆</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BezierEllipse1(context,&nbsp;470,&nbsp;80,&nbsp;100,&nbsp;20);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//椭圆</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BezierEllipse2(context,&nbsp;470,&nbsp;200,&nbsp;50,&nbsp;50);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//圆</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BezierEllipse2(context,&nbsp;470,&nbsp;200,&nbsp;100,&nbsp;20);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//椭圆</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//检测相似性(重合的程度)</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParamEllipse(context,&nbsp;300,&nbsp;450,&nbsp;250,&nbsp;50);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.strokeStyle&nbsp;=&nbsp;"yellow";</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BezierEllipse1(context,&nbsp;300,&nbsp;450,&nbsp;250,&nbsp;50);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.strokeStyle&nbsp;=&nbsp;"blue";</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BezierEllipse2(context,&nbsp;300,&nbsp;450,&nbsp;250,&nbsp;50);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;function&nbsp;clearCavnas()</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.clearRect(0,&nbsp;0,&nbsp;600,&nbsp;600);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">//&nbsp;]]&gt;&lt;/script&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&lt;p&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&lt;br&nbsp;/&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick="execDraw();"&nbsp;type="button"&gt;执行&lt;/button&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick="clearCanvas();"&nbsp;type="button"&gt;清理&lt;/button&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">&lt;/p&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">注意，要成功运行代码，需要支持HTML5的Canvas的浏览器。<br /><br />本文转载至：</span>http://www.cnblogs.com/shn11160/archive/2012/08/27/2658057.html</p></div><img src ="http://www.blogjava.net/hyljava/aggbug/396649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2013-03-19 12:50 <a href="http://www.blogjava.net/hyljava/archive/2013/03/19/396649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>