Svg五角星、太阳花、多边形的绘制

2023-11-04

我们在学习平面几何中,学到了多边形的概念,有多少条边就有多少个顶点。本篇我们介绍一下如何用svg来绘制规则的多边形,比如三角形、五角星和任意多边形。在此,我们用到polygon标签,<polygon> 标签用来创建含有不少于三个边的图形。

多边形的绘制最关键的是各个顶点的确定,确定各个顶点后只要将顶点之间连线就可以得到多边形,当然,顶点间的连线顺序不同,得到的图形也不同,如下面的5顶点的图形:

第一张图形,只要计算出指定圆的边上的顶点,顺序连线就可以得到,而第二张图形在第一张图形的基础上还需要确定各顶点的连线顺序。

我们使用python来计算多边形的各个顶点以及拼接成svg中<polygon>标签需要的数据格式,并打印出来,源码如下:

import math


#顶点都在圆上等分的多角形
def circle_point(num, x=0,y=0,r=1.0, anglepy=0):
    step = 2*math.pi/num
    start = anglepy/360.0 *2*math.pi

    points = []
    for i in range(num):
        an1 = step*i+start
        tmpx,tmpy=math.cos(an1), -math.sin(an1) #由于直角坐标和svg画布坐标的y轴相反,所以y坐标取负号
        # print("%d,(%.2f,%.2f)"%(i,tmpx,tmpy))
        px = tmpx * r + x
        py = tmpy * r + y
        points.append((px,py))

    restr = ""
    for point in points:
        restr += "%.2f,%.2f "%(point[0],point[1])
    print("第一种:", restr)
    return points


#等分多角形,num为顶点数,x,y是圆心坐标,r为圆的半径, anglepy为起始点的角度偏移位置
def starN(num, x=0,y=0,r=1.0, anglepy=0):
    point0s = circle_point(num, x, y, r, anglepy) #按顶点数在圆上计算出各个点坐标
    step = (num-3)//2 #不同的顶点数连线跳过的点数不一样

    list1 = pointskip(num,step) #计算连线顺序

    restr = ""
    point1s=[]
    for i in list1:
        point1s.append(point0s[i])
        restr += "%.2f,%.2f " % (point0s[i][0], point0s[i][1])
    print("第二种:", restr)
    return point1s


def pointskip(n,k):
    # list0 = range(n)
    list0 = [i for i in range(n)]
    total_list = list0*n

    list1=[]
    i=0
    while i<n*n:
        id = total_list[i]
        if id in list1:
            i+=1
            continue
        list1.append(id)
        i+=(k+1)

    return list1


if __name__ == "__main__":
    starN(36,150,150,150,0)

这里示例中封装了一个函数starN用于生成多边形<polygon>标签需要的数据格式,参数的含义:num为顶点数,x,y是圆心坐标,r为圆的半径, anglepy为起始点的角度偏移位置。

上面代码填入的num=5为5边形,生成是数据如下:

选取第一行数据,填入svg模板中得到上面的图1五边形,这第二行数据,填入svg模板中,得到图2的五角星,svg模板源码如下:

<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
<polygon points="300.00,150.00 28.65,61.83 196.35,292.66 196.35,7.34 28.65,238.17 " stroke="red"  stroke-width="1" fill="yellow" fill-rule="evenodd"/>
</svg>

八边形的数据为

300.00,150.00 43.93,43.93 150.00,300.00 256.07,43.93 0.00,150.00 256.07,256.07 150.00,0.00 43.93,256.07

替换上面svg模板的polygon中的points,得到的图形如下:

Num=16得到16角星的数据

300.00,150.00 11.42,92.60 256.07,256.07 92.60,11.42 150.00,300.00 207.40,11.42 43.93,256.07 288.58,92.60 0.00,150.00 288.58,207.40 43.93,43.93 207.40,288.58 150.00,0.00 92.60,288.58 256.07,43.93 11.42,207.40

生成图形为:

太阳花取36边形,得到的数据:

300.00,150.00 2.28,123.95 290.95,201.30 20.10,75.00 264.91,246.42 53.58,35.09 225.00,279.90 98.70,9.05 176.05,297.72 150.00,0.00 123.95,297.72 201.30,9.05 75.00,279.90 246.42,35.09 35.09,246.42 279.90,75.00 9.05,201.30 297.72,123.95 0.00,150.00 297.72,176.05 9.05,98.70 279.90,225.00 35.09,53.58 246.42,264.91 75.00,20.10 201.30,290.95 123.95,2.28 150.00,300.00 176.05,2.28 98.70,290.95 225.00,20.10 53.58,264.91 264.91,53.58 20.10,225.00 290.95,98.70 2.28,176.05

生成图形为:

怎么样?是不是很简单,只有计算出图形的顶点,通过polygon标签就很容易的生成各种多边形图形,如果你有好的创意还可以生成更有趣的图案,你也来试试吧!

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Svg五角星、太阳花、多边形的绘制 的相关文章

随机推荐

  • ubuntu18.04安装cmake3.18.0

    ubuntu18 04安装cmake3 18 0 1 本方法可适用安装任何版本的cmake 可以在官网中找到需要的版本 本文以3 18 0为例 https cmake org files 2 wget https cmake org fil
  • Javaweb和微信小程序项目部署阿里云服务器总结(上)

    谈到微信小程序的java后台怎么部署在阿里云服务器上的问题 弯弯绕绕 好多坑 网上的博客资料也特别乱 博主也是在没有任何经验和指导下花了几天的工夫才完成的 这里为了方便大家不踩坑 总结了下整个流程和注意事项 由于篇幅原因 只讲重点的地方 所
  • 软件测试(3)——白盒测试

    文章目录 白盒测试 白盒测试方法 静态测试 人工代码检查 软件度量 其它方法 动态测试 覆盖测试分析 运行时错误检测 覆盖测试 逻辑覆盖方法 路径测试 数据流测试 白盒测试 白盒测试也称结构性测试 逻辑驱动测试 基于程序的测试 特点 将程序
  • Android App开机自启动

    最近项目中 有用到开机自启动的功能 这里做一下总结 供大家学习探讨 Android 开机启动延迟问题 Android 开机自启动被拦截问题 实战演练 测试手机 红米手机 Redmi 6A 安卓version 9 华为手机 DUA AL00
  • vs2010 vs2013等vs中如何统计整个项目的代码行数

    vs2010 vs2013等vs中如何统计整个项目的代码行数 在一个大工程中有很多的源文件和头文件 我如何快速统计总行数 解决方案 b b b b ctrl shift F 查找选项选 正则表达式 具体步骤 1 鼠标停靠在你的项目解决方案附
  • ERRORS: auth.User.groups: (fields.E304) Reverse accessor for ‘User.groups‘ clashes with reverse acce

    写博客网站后台 设计数据库结构时 博客 Article 表中定义了一个作者外键 author models ForeignKey settings AUTH USER MODEL verbose name 作者 这个外键是网站注册用户 这样
  • Oracle数据库获取uuid函数

    Oracle新建系统表时 要求主键为32位uuid 猜测Oracle肯定会提供相关的函数 翻阅相关文档 果然发现Oracle提供的函数 sys guid 用于获取32位uuid 简单使用为 select sys guid from dual
  • 【Linux内核中的并发控制】- 自旋锁

    在内核中会经常看到spin lock 自旋锁 它到底是个神马东西 在驱动相关的书籍和论坛中查阅了不少资料 看的也是云里雾里 现在将知识罗列总结一下 便于日后回顾 1 自旋锁定义 在Linux内核并发控制中最常见的锁就是自旋锁 自旋锁最多只能
  • POJ 1302 Blue Gene, Jr.(递归实现)

    Inspired by IBM s Blue Gene project the CEO of Universal Biological Machinery UBM has called on you UBM s top software e
  • Intellij IDEA 报错java.lang.NoClassDefFoundError

    Intellij IDEA 报错java lang NoClassDefFoundError Intellij IDEA 报错java lang NoClassDefFoundError 11 Aug 2018 23 48 24 686 严
  • MQTT通信协议的简介、特点及实现原理 - 第1章

    目录 1 1 MQTT 特点 1 2 MQTT实现原理 1 3 术语 相关链接 MQTT是一种基于 发布 订阅 模式的 轻量级 通信协议 由IBM于1999年发布 MQTT专门针对 物联网设备 开发 是一种 低开销 低带宽占用的即时通讯协议
  • python之异常、异常的捕获、else、finally、主动抛出异常raise

    注意 当一个函数的返回值是一个布尔值的时候 如果把这个函数做为条件放到 if 或者while后面的时候 后面不用再写 True 也就是说 此时的 if 函数名 等价于 if 函数名 True 如果函数返回True 则原式就等于if True
  • AttributeError: ‘open3d.open3d.geometry.PointCloud‘ object has no attribute ‘select_by_index‘

    如果你调用时的方式是 pcd select by index ind 但是你这样却报了 AttributeError open3d open3d geometry PointCloud object has no attribute sel
  • i.MXU6LL - 制作烧录SD卡详细步骤

    i MXU6LL 制作烧录SD卡详细步骤 目录 i MXU6LL 制作烧录SD卡详细步骤 1 SD卡分区 2 拷贝uboot到SD卡 3 拷贝kernel和dtbs到SD卡 4 拷贝文件系统到SD卡 本文所有操作均在root模式下进行 本篇
  • python笔记:3.2.2.8pandas数据操作_时间序列范围和偏移量

    coding utf 8 Created on Fri May 24 14 47 40 2019 author User import pandas as pd print n 月末时序索引 pd date range start 2017
  • 浅谈游戏业务遭遇攻击的防护措施

    很多人不禁问DDoS攻击是什么 尤其是对刚入行的新手小白来说 对于这方面完全不懂 那么今天我们就来讲讲它是什么又会造成什么危害 该如何防御 DDoS攻击也叫分布式拒绝服务 Distributed Denial of Service 简称DD
  • Loadrunner 8.1 安装 & 卸载收藏(转载)

    Loadrunner 8 1 安装 1 下载Loadrunner8 1 官方英文版 2 安装Loadrunner8 1 3 破解 http download csdn net source 1348756 l 具体安装操作步骤如下 用虚拟光
  • 华为OD机试 - 数组拼接(Java)

    题目描述 现在有多组整数数组 需要将它们合并成一个新的数组 合并规则 从每个数组里按顺序取出固定长度的内容合并到新的数组中 取完的内容会删除掉 如果该行不足固定长度或者已经为空 则直接取出剩余部分的内容放到新的数组中 继续下一行 输入描述
  • Kali-Linux下载安装

    文章目录 下载 安装 准备 Kali Linux Live U盘安装过程 下载 1 进入kali逛网下载镜像文件kali官网 在Downloads中选择Download Kali Linux 如下图所示 2 根据电脑配置 选择适合自己的版本
  • Svg五角星、太阳花、多边形的绘制

    我们在学习平面几何中 学到了多边形的概念 有多少条边就有多少个顶点 本篇我们介绍一下如何用svg来绘制规则的多边形 比如三角形 五角星和任意多边形 在此 我们用到polygon标签