css3 画圆-Canvas绘制椭圆的方式

2023-08-20 0 1,328 百度已收录

其实题目是画椭圆,先说Canvas中的圆

Canvas画圆相信大家都很熟悉

oGC.arc(400,300,100,0,2*Math.PI,false);

如上图,直接调用API就可以了,计算机利用内部的光栅,借助Bresenham算法来画圆。 我们把这个放在最后css3 画圆,我们来谈谈借助圆的参数多项式来画圆。

Circle(oGC,400,300,100);functioncircle(context,x,y,a){//x,y为坐标; a为直径 varr=1/a;//①注意:这里的r可以硬编码css3 画圆,但不仁慈的情况下,写死的值是不一样的

上下文.beginPath();

context.moveTo(x+a,y);for(vari=0;i<2*Math.PI;i+=r){

context.lineTo(x+a*Math.cos(i),y+a*Math.sin(i));

语境。 关闭路径();

语境。 充满();

原则是什么? 相信三角函数学好的童鞋很容易理解。 如果你不知道,请注意注意①。 我把r的值改一下,相信会有效果的~

r 和 2*Math.PI 的组合就是圆的精细度。 当直径为100时,r可为1/10。 如果常见的话可以写成r=1/a; 这样,无论直径大还是小,圆都会很细,对性能影响很大

现在我们来看看文章的主角,看椭圆看圆

functionEllipSEOne(上下文,x,y,a,b){varstep=(a>b)?1/a:1/b;

上下文.beginPath();

context.moveTo(x+a,y);for(vari=0;i<2*Math.PI;i+=step){

context.lineTo(x+a*Math.cos(i),y+b*Math.sin(i));

语境。 关闭路径();

语境。 充满();

它与圆基本相同,但圆只有一个直径,而椭圆则分为长轴和短轴。

看看疗效吧~

好了,椭圆的绘制成功了,文章就结束了~

这怎么可能! !

这样结束就太鸡肋了,刚才是第一种方法,下面看看其他的方法

方法二、均匀压缩

这是我最喜欢的方法。 这很容易理解。 与方法1相比,性能要快很多。 先贴出代码吧~

functionEllipseTwo(上下文,x,y,a,b){

context.save();varr=(a>b)?a:b;varratioX=a/r;varratioY=b/r;

context.scale(ratioX,ratioY);

上下文.beginPath();

context.arc(x/ratioX,y/ratioY,r,0,2*Math.PI,false);

语境。 关闭路径();

语境。 恢复();

语境。 充满();

其原理是借助尺度来压缩一个标准圆。 ratioX 是垂直轴的缩放百分比,ratioY 是水平轴的缩放百分比。 由于这两个值不同,所以标准圆被缩放为椭圆

记住save()和restore()恢复上下文环境,soeasy理解的方式

下面两种方法要求很高,都使用三次贝塞尔曲线方法

方式三、四、贝塞尔法

functionEllipseThree(上下文,x,y,a,b){varox=0.5*a,

oy=0.6*b;

语境。 节省();

语境。 翻译(x,y);

上下文.beginPath();

上下文.moveTo(0,b);

context.bezierCurveTo(ox,b,a,oy,a,0);

context.bezierCurveTo(a,-oy,ox,-b,0,-b);

context.bezierCurveTo(-ox,-b,-a,-oy,-a,0);

context.bezierCurveTo(-a,oy,-ox,b,0,b);

语境。 关闭路径();

语境。 充满();

语境。 恢复();

}functionEllipseFour(上下文,x,y,a,b){vark=0.5522848,

ox=k*a,

oy=k*b;

语境。 翻译(x,y);

上下文.beginPath();

context.moveTo(-a,0);

context.bezierCurveTo(-a,oy,-ox,-b,0,-b);

context.bezierCurveTo(ox,-b,a,-oy,a,0);

context.bezierCurveTo(a,oy,ox,b,0,b);

context.bezierCurveTo(-ox,b,-a,oy,-a,0);

语境。 关闭路径();

语境。 充满();

贝塞尔方法的核心在于两个控制点的选择,它有一个致命的问题。 当lineWidth较宽时,椭圆更平坦,长轴更尖锐,不会平滑

如果不知道贝塞尔是啥的可以自行百度...这个我就不解释了...

还有最后一个光栅方法来绘制椭圆。 光栅法画圆很简单,但是画椭圆就很麻烦。 下面是最简单的椭圆绘制方法,相当于lineWidth为1px的情况

functionEllipseFive(context,x,y,a,b){vardata=context.getImageData(0,0,800,600);varimageData=data.data;vartx=0;varty=b;vard=b*b+a*a*(- b+0.25);varmx=a*a/Math.sqrt(a*a+b*b);while(tx0){if(d<0){

交易++;

d+=b*b*(2*tx+2)+a*a*(-2*ty+3);

}别的{

d+=a*a*(-2*ty+3);

ty--;

setPix(x+tx,y+ty);

setPix(x-tx,y+ty);

setPix(x+tx,y-ty);

setPix(x-tx,y-ty);

context.putImageData(data,0,0);functionsetPix(x,y){

console.log(x,y);varindex=getStartIndex(x,y);for(vari=0;i<4;i++){if(i==3){

图像数据[索引+i]=255;

}别的{

图像数据[索引+i]=128;

}functiongetStartIndex(x,y){返回*800*4+x*4;

给个结果图吧~

光栅法的原理这里就不讲了,讲起来会花很长时间,而且这里不建议用光栅法画椭圆,因为对于不同的线宽来说很麻烦

好了,这篇文章就到这里了,谢谢~

所有笔试题(java、前端、数据库、springboot等)一气呵成,请关注文末小程序

腾讯云】1核2G5M轻量级应用服务器50元,性价比高,助您轻松上云

仍在学习,永不放弃。 作为技术人员很容易被淘汰。 只有不断学习,才能拥有良好的生存空间。 明天小编就整理一下CSS3勾画基本图形的绘制方法,分享给大家!

1. 圆形

css3 画圆-Canvas绘制椭圆的方式

画一个圆应该是最简单的,直接设置div的宽高,填充颜色,效果就下来了。

2.圆角正方形

画圆角正方形也很简单。 在1的基础上,可以使用CSS3的border-radius。

3. 圆形

css3 画圆-Canvas绘制椭圆的方式

根据圆形的特点,在2的基础上,将div的宽度和高度设置为正圆形,然后将border-radius设置为50%。

4.椭圆

椭圆也很简单,只需要在3的基础上让div的宽度和高度不一致即可。为了更好看,建议将宽度设置为高度的1.5倍。

5. 三角形

css3 画圆-Canvas绘制椭圆的方式

三角形比其他三角形稍微困难一些。 这里我们需要使用border-style属性来分别设置四个边的边框长度。 最终疗效见下面代码。

6. 弧线

本质上是借助圆角来实现的。 现在需要将圆的左上角圆角绘制成圆弧,因此将左边框和斜边边框的长度设置为0px,使其不可见css3三角形,并设置左上角圆角的直径,令变得更大更明显,其余圆角的直径全部设置为0px,这样就完成了一个圆弧。

7. 平行四边形

css3 画圆-Canvas绘制椭圆的方式

平行四边形在圆形的基础上使用了 CSS3 变换属性。 使用变体功效。

8.六角星

六角星使用“:after”在相反方向制作另一个三角形,然后在定位中将它们堆叠在一起以产生六角星。 说白了就是两个三角形拼在一起就形成了一个六角星。

9.五角星

css3 画圆-Canvas绘制椭圆的方式

五角星主要利用了CSS3的transform属性css3三角形,与“:after”配合使用。

10.心形、阴阳图、PointBurst、Momo仿消息框、吃豆人等就不一一举例了,直接看代码即可。

整个代码如下:





.rectangle {
    width: 150px;
    height: 100px;
    background-color: orangered;
    margin-bottom:5px;
}
.rounded-rectangle {
    width: 150px;
    height: 100px;
    background-color: orangered;
    border-radius: 10%;
    margin-bottom:5px;
}
.circle {
    width: 100px;
    height: 100px;
    background-color: orangered;
    border-radius: 50%;
    margin-bottom:5px;
}
.ellipse {
    width: 150px;
    height: 100px;
    background-color: orangered;
    border-radius: 50%;
    margin-bottom:5px;
}
.triangle{
    width: 0px;
    height: 0px;
    border-style: solid;
    background-color: transparent;
    border-top-color: transparent;
    border-right-color: transparent;
    border-bottom-color: blue;
    border-left-color:transparent;
    border-top-width: 50px;
    border-bottom-width: 50px;
    border-left-width: 50px;
    border-right-width: 50px;
    margin-bottom:5px;
}
.line{
    width: 100px;
    height: 3px;
    background-color: orangered;
    margin-bottom:5px;
}
.arc {
    width: 100px;
    height: 100px;
    border-style: solid;
    border-top-width: 10px;
    border-bottom-width: 0px;
    border-left-width: 10px;
    border-right-width: 0px;
    border-top-color: blue;
    border-bottom-color: red;
    border-left-color: red;
    border-right-color: red;
    background-color: transparent;
    border-top-right-radius: 0px;
    border-top-left-radius: 100px;
    border-bottom-right-radius: 0px;
    border-bottom-left-radius: 0px;
}
.parallelogram {
    width: 150px;
    height: 100px;
    -webkit-transform: skew(20deg);
    -moz-transform: skew(20deg);
    -o-transform: skew(20deg);
    transform: skew(20deg);
    background: red;
    margin-top:20px;
    margin-left:20px;
}
.star-six {
    width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 100px solid red;
    position: relative;
}
.star-six:after {
    width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-top: 100px solid red;
    position: absolute;
    content: "";
    top: 30px;
    left: -50px;
}
.star-five {
    margin: 50px 0;
    position: relative;
    display: block;
    color: red;
    width: 0px;
    height: 0px;
    border-right: 100px solid transparent;
    border-bottom: 70px solid red;
    border-left: 100px solid transparent;
    -moz-transform: rotate(35deg);
    -webkit-transform: rotate(35deg);
    -ms-transform: rotate(35deg);
    -o-transform: rotate(35deg);
    transform: rotate(35deg);
}
.star-five:before {
    border-bottom: 80px solid red;
    border-left: 30px solid transparent;
    border-right: 30px solid transparent;
    position: absolute;
    height: 0;
    width: 0;
    top: -45px;
    left: -65px;
    display: block;
    content: '';
    -webkit-transform: rotate(-35deg);
    -moz-transform: rotate(-35deg);
    -ms-transform: rotate(-35deg);
    -o-transform: rotate(-35deg);
    transform: rotate(-35deg);
}
.star-five:after {
    position: absolute;
    display: block;
    color: red;
    top: 3px;
    left: -105px;
    width: 0px;
    height: 0px;
    border-right: 100px solid transparent;
    border-bottom: 70px solid red;
    border-left: 100px solid transparent;
    -webkit-transform: rotate(-70deg);
    -moz-transform: rotate(-70deg);
    -ms-transform: rotate(-70deg);
    -o-transform: rotate(-70deg);
    transform: rotate(-70deg);
    content: '';
}
.heart{
    width:160px;
    height:200px;
    position:relative
} 
.heart:before{
    content:" ";
    border: 0 solid transparent; 
    -moz-border-radius:100px;
    -webkit-border-radius:100px;
    border-radius:100px 100px 0 0;
    width:80px; height:120px;
    background:#669;
    -moz-transform: rotate(-45deg);
    -ms-transform: rotate(-45deg);
    -o-transform: rotate(-45deg);
    -webkit-transform: rotate(-45deg);
    position:absolute;
    left:20px;
} 
.heart:after{
    content:" ";
    border: 0 solid transparent;
    -moz-border-radius:100px;
    -webkit-border-radius:100px;
    border-radius:100px 100px 0 0;
    width:80px; 
    height:120px;
    background:#669;
    -moz-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    -webkit-transform: rotate(45deg); 
    position:absolute;
    left:48px;
    top:0px;
}
.pac-man {
    width: 0px;
    height: 0px;
    border: 60px solid red;
    border-color: red transparent red red ;
    -moz-border-radius: 60px;
    -webkit-border-radius: 60px;
    border-radius: 60px;
}
.talkbubble {
    width: 120px;
    height: 80px;
    background: red;
    position: relative;
    -moz-border-radius: 10px;
    -webkit-border-radius: 10px;
    border-radius: 10px;
    margin-left:20px;
    margin-bottom:20px;
}
.talkbubble:before {
    content:"";
    position: absolute;
    right: 100%;
    top: 26px;
    width: 0;
    height: 0;
    border-top: 13px solid transparent;
    border-right: 26px solid red;
    border-bottom: 13px solid transparent;
    margin-left:20px;
    margin-bottom:20px;
}
.burst-12 {
    background: red;
    width: 80px;
    height: 80px;
    position: relative;
    text-align: center;
    margin-left:20px;
}
.burst-12:before,
.burst-12:after {
    content: "";
    position: absolute;
    top: 0; left: 0;
    height: 80px;
    width: 80px;
    background: red;
}
.burst-12:before {
    -webkit-transform: rotate(30deg);
    -moz-transform: rotate(30deg);
    -ms-transform: rotate(30deg);
    -o-transform: rotate(30deg);
    transform: rotate(30deg);
}
.burst-12:after {
    -webkit-transform: rotate(60deg);
    -moz-transform: rotate(60deg);
    -ms-transform: rotate(60deg);
    -o-transform: rotate(60deg);
    transform: rotate(60deg);
}
.yin-yang {
    width: 96px;
    height: 48px;
    background: #eee;
    border-color: red;
    border-style: solid;
    border-width: 2px 2px 50px 2px;
    border-radius: 100%;
    position: relative;
}
.yin-yang:before {
    content: "";
    position:
    absolute;
    top: 50%;
    left: 0;
    background: #eee;
    border: 18px solid red;
    border-radius: 100%;
    width: 12px;
    height: 12px;
}
.yin-yang:after {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    background: red;
    border: 18px solid #eee;
    border-radius:100%;
    width: 12px;
    height: 12px;
}



    
    
         
         
         
         
         
         
         
         
         
         
         
         
         

         
    

点击此处查看跑步效果​

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 css3 css3 画圆-Canvas绘制椭圆的方式 https://www.wkzy.net/game/126713.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务