求高效的js画圆代码

fuyun 2009-05-11
如题:
1.实心圆;
2.空心圆;
3.有背景图片填充的圆.
实现者,献 一个...嘿嘿~...

ps.画圆么,不难,本人已实现(除背景图片的那个),但效率还真不敢恭维哈...尤其是在圆半径大于200px的时候...故求,高效的圆代码...
kimmking 2009-05-12
svg或是vml
fuyun 2009-05-12
kimmking 写道
svg或是vml

多谢2楼...
昨日曾看到一篇技术贴,用的就是svg,可惜昨天还不知道这个...今天你提示了,特意上Google搜索了一下.
非常感激...嘻嘻~现在兑现承诺,献 一个给你...
贴一下,昨天搜到的svg画圆代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>
<head><title>javascript画圆</title></head>
<body>
<div id="svg" style="width:200px;height:200px;"> </div>
<script type="text/javascript">
var cont;
var circle=new Function();
if (document.createElementNS) {
  svgNS = "http://www.w3.org/2000/svg";
  svg = document.createElementNS(svgNS, "svg");
  SVG = (svg.x != null);

  createSVGVML = function(o, antialias) {
    cont = document.createElementNS(svgNS, "svg");
    o.appendChild(cont);
    svgAntialias = antialias;
    
  }

  circle = function(diam, color) {
    var o = document.createElementNS(svgNS, "circle");
    
    o.setAttribute("shape-rendering", false);
    o.setAttribute("stroke-width", "2px");
    o.setAttribute("stroke-color", color);
    o.setAttribute("r", Math.round(diam / 2));
    
    o.setAttribute("cx", (diam / 2+2)+"px");
    o.setAttribute("cy", (diam / 2+2)+"px");
    o.setAttribute("stroke", color);
    o.setAttribute("fill", "none");
    o.style.cursor = "pointer";
    cont.appendChild(o);
  }
}
else if(document.createStyleSheet){
  createSVGVML = function(o, antialias) {
    document.namespaces.add("v", "urn:schemas-microsoft-com:vml");
    var style = document.createStyleSheet();
    style.addRule('v\\:*', "behavior: url(#default#VML);");
    style.addRule('v\\:*', "antialias: "+antialias+";");
    cont = o;
  }
  circle = function (diam, color) {
    var o = document.createElement("v:oval");
    o.style.position = "absolute";
    o.style.cursor = "pointer";
    o.strokeweight = 2;
    o.strokeColor = color;
    o.style.width = diam + "px";
    o.style.height = diam + "px";

    cont.appendChild(o);
    try{
      return o;
    }finally{
      o=null;
    }
  }

}
createSVGVML(document.getElementById("svg"));

circle(100,"#cccccc");

</script>
</body>
</html>
kc_ren 2009-05-12
使用 Canvas 技术(Flotr) 性能很好~就是IE8下要写IE7兼容
fuyun 2009-05-12
kc_ren 写道
使用 Canvas 技术(Flotr) 性能很好~就是IE8下要写IE7兼容

现在各浏览器对Canvas的支持情况和兼容性好象不是很好...
fuyun 2009-05-12
kimmking 写道
svg或是vml

补充一下,参考下面的网页:http://www.mozilla.org/projects/svg/status.html
这个是firefox对svg支持情况的一个列表.
貌似,现在诸多浏览器对svg的支持也还不是很完善哈...
vlinux 2009-05-14
  1 <html>
  2 
  3     <script type="text/javascript">
  4         function init() {
  5             alert("也许你只是需要换一种思维?");
  6         }
  7     </script>
  8     
  9     <body onload="init();">
 10         <div id="circle_div">
 11             <img src="circle.png" style="width:50px;height:60px; "/>
 12         </div>
 13     </body>
 14 </html>
fuyun 2009-05-14
vlinux 写道
  1 <html>
  2 
  3     <script type="text/javascript">
  4         function init() {
  5             alert("也许你只是需要换一种思维?");
  6         }
  7     </script>
  8     
  9     <body onload="init();">
 10         <div id="circle_div">
 11             <img src="circle.png" style="width:50px;height:60px; "/>
 12         </div>
 13     </body>
 14 </html>

你这是用图片来取代了...
这个问题的本意是js动画效果的实现,进一步的是要实现页面的动态交互性.
PS.用图片的话,在图片较大较多的情况下,对网络要求相比较之下要更高些...(速度肯定会慢些了...),而且也不易扩展,比如,就以一个圆为例,要更换圆半径,圆周颜色和圆面填充色,以及圆显示的动画效果...这样工作量就太大了...
vlinux 2009-05-15
1.图片浏览器肯定是会缓存下来的,改变img的长、宽也只是在css层进行控制,换言之就是在浏览器层控制的,不会涉及到网络。一般一个简单的圆的矢量图是很小的,不必太在意这个网络开销。

2.更换圆的半径、改变圆的大小可以通过控制width和height来实现;改变style也可以通过更改背景图片来实现,当然缺点是有的:预先制定的style肯定是有限的。

当然,如果你还需要更进一步的交互,我个人就觉得此时就不再适合用javascript了。
fuyun 2009-05-15
vlinux 写道
1.图片浏览器肯定是会缓存下来的,改变img的长、宽也只是在css层进行控制,换言之就是在浏览器层控制的,不会涉及到网络。一般一个简单的圆的矢量图是很小的,不必太在意这个网络开销。

2.更换圆的半径、改变圆的大小可以通过控制width和height来实现;改变style也可以通过更改背景图片来实现,当然缺点是有的:预先制定的style肯定是有限的。

当然,如果你还需要更进一步的交互,我个人就觉得此时就不再适合用javascript了。

楼上的还没明白本意,画圆不是目的,只是借这个理解js实现图形或动画编程的原理.
另外,说白了,自己是想用js实现图片的动态效果(正因为对ps等其他工具的不熟,或者也可以说没有图形图像这方面的天赋,所以只能借助于编程等软方式来实现了).
当图像简单的时候还好办,要复杂了,还要动画效果,这个图片的制作不是一般人可以胜任的.
Global site tag (gtag.js) - Google Analytics