利用Canvas在紫微斗数命盘上画出三方四正
许多紫微斗数排盘程序都会在命盘上画出三方四正的指示线,便于观察命盘。本文用Canvas在一个模拟命盘上画出三方四正指示线。
模拟命盘并画出“子”宫三方四正的HTML文件如下:
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>voice2text - Convert MP3 to Text</title><style>.center {text-align: center;font-size: 16px;font-weight: bold;display: flex;justify-content: center;align-items: center;}.frame {border: 3px solid black;width: 908px;/* 容器宽度 */height: 908px;/* 容器高度 */padding: 5px 0 0 5px;position: relative;}/* 定义网格容器样式 */.grid-container {display: grid;/* 定义4列(纵向5根网格线,编号从1到5),每列宽度为均分 */grid-template-columns: repeat(4, 1fr);/* 定义4行(横向5根网格线,编号从1到5),每行高度为均分 */grid-template-rows: repeat(4, 1fr);gap: 2px;/* 行列单元格之间的间隔 */width: 902px;/* 容器宽度 */height: 902px;/* 容器高度 */}/* 中央,第2行第2列,合并两行两列,列开始于2号列网格线,结束于第4号列网格线;行开始于2号行网格线,结束于第4号行网格线;*/.item0 {grid-column: 2 / 4;grid-row: 2 / 4;position: relative;border: 1px solid #000;}/* 子,第4行第3列,列开始于3号列网格线,结束于第4号列网格线;行开始于4号行网格线,结束于第5号行网格线;*/.item1 {grid-column: 3 / 4;grid-row: 4 / 5;position: relative;border: 1px solid #000;}/* 丑,第4行第2列,列开始于2号列网格线,结束于第3号列网格线;行开始于4号行网格线,结束于第5号行网格线;*/.item2 {grid-column: 2 / 3;grid-row: 4 / 5;position: relative;border: 1px solid #000;}/* 寅,第4行第1列,列开始于1号列网格线,结束于第2号列网格线;行开始于4号行网格线,结束于第5号行网格线;*/.item3 {grid-column: 1 / 2;grid-row: 4 / 5;position: relative;border: 1px solid #000;}/* 卯,第3行第1列,列开始于1号列网格线,结束于第2号列网格线;行开始于3号行网格线,结束于第4号行网格线;*/.item4 {grid-column: 1 / 2;grid-row: 3 / 4;position: relative;border: 1px solid #000;}/* 辰,第2行第1列,列开始于1号列网格线,结束于第2号列网格线;行开始于2号行网格线,结束于第3号行网格线;*/.item5 {grid-column: 1 / 2;grid-row: 2 / 3;position: relative;border: 1px solid #000;}/* 巳,第1行第1列,列开始于1号列网格线,结束于第2号列网格线;行开始于1号行网格线,结束于第2号行网格线;*/.item6 {grid-column: 1 / 2;grid-row: 1 / 2;position: relative;border: 1px solid #000;}/* 午,第1行第2列,列开始于2号列网格线,结束于第3号列网格线;行开始于1号行网格线,结束于第2号行网格线;*/.item7 {grid-column: 2 / 3;grid-row: 1 / 2;position: relative;border: 1px solid #000;}/* 未,第1行第3列,列开始于3号列网格线,结束于第4号列网格线;行开始于1号行网格线,结束于第2号行网格线; */.item8 {grid-column: 3 / 4;grid-row: 1 / 2;position: relative;border: 1px solid #000;}/* 申,第1行第4列,列开始于4号列网格线,结束于第5号列网格线;行开始于1号行网格线,结束于第2号行网格线; */.item9 {grid-column: 4 / 5;grid-row: 1 / 2;position: relative;border: 1px solid #000;}/* 酉,第2行第4列,列开始于4号列网格线,结束于第5号列网格线;行开始于2号行网格线,结束于第3号行网格线;*/.item10 {grid-column: 4 / 5;grid-row: 2 / 3;position: relative;border: 1px solid #000;}/* 戌,第3行第4列,列开始于4号列网格线,结束于第5号列网格线;行开始于3号行网格线,结束于第4号行网格线;*/.item11 {grid-column: 4 / 5;grid-row: 3 / 4;position: relative;border: 1px solid #000;}/* 亥,第4行第4列,列开始于4号列网格线,结束于第5号列网格线;行开始于4号行网格线,结束于第5号行网格线;*/.item12 {grid-column: 4 / 5;grid-row: 4 / 5;position: relative;border: 1px solid #000;}/* 设置 canvas 为绝对定位,并通过 z-index 让其显示在上面 */#myCanvas {position: absolute;top: 0;left: 0;z-index: 1;}</style>
</head>
<body><div class="frame"><!-- 划三方四正 --><canvas id="myCanvas" width="910" height="910"></canvas><div class="grid-container"><div class="item0 center">Center</div><div class="item1 center">子</div><div class="item2 center">丑</div><div class="item3 center">寅</div><div class="item4 center">卯</div><div class="item5 center">辰</div><div class="item6 center">巳</div><div class="item7 center">午</div><div class="item8 center">未</div><div class="item9 center">申</div><div class="item10 center">酉</div><div class="item11 center">戌</div><div class="item12 center">亥</div></div></div><script>function drawDashedLine(ctx, index) {p1 = (index + 4) % 12p2 = (index + 8) % 12p3 = (index + 6) % 12// 绘制虚线ctx.beginPath();ctx.lineTo(points[index][0], points[index][1]);ctx.lineTo(points[p1][0], points[p1][1]);ctx.lineTo(points[p2][0], points[p2][1]);ctx.lineTo(points[index][0], points[index][1]);ctx.lineTo(points[p3][0], points[p3][1]);ctx.stroke();}const points = {0: [580, 685], 1: [355, 685], 2: [225, 685], 3: [225, 580],4: [225, 325], 5: [225, 225], 6: [355, 225], 7: [580, 225],8: [685, 225], 9: [685, 325], 10: [685, 580], 11: [685, 685]};const canvas = document.getElementById('myCanvas');const ctx = canvas.getContext('2d');// 设置虚线样式ctx.setLineDash([5, 5]);ctx.strokeStyle = "rgb(0 0 255 / 50%";drawDashedLine(ctx, 0);</script>
</body>
</html>
显示效果:

代码解释:
1、为了使Canvas浮动在命盘上方,需要给Canvas元素的css属性position定义为absolute,并将其父容器div.frame的css属性position定义为relative。Canvas的宽度和高度需要规定的足够大,以确保其中所绘图形能够完全展示。根据MDN文档的介绍,Canvas的宽度和高度推荐在元素标签中以属性的方式指定,而不推荐使用css规定。
2、由于命盘上各宫的尺寸都是固定的,所以,各宫用于连线的点也都可以预先确定。上面的代码中给从子到亥的十二宫的连线点都预先确定好了,并保存在points字典中:
const points = {
0: [580, 685], 1: [355, 685], 2: [225, 685], 3: [225, 580],
4: [225, 325], 5: [225, 225], 6: [355, 225], 7: [580, 225],
8: [685, 225], 9: [685, 325], 10: [685, 580], 11: [685, 685]
};
3、按紫微斗数的规则,命宫的三会宫的索引与命宫的索引差值为4,命宫的对冲宫位的索引与命宫的差值为6,因此,只需将命宫的索引传给划线函数,就能找出三会宫及对冲宫的索引,也就能从points字典中找出四个连线点。
p1 = (index + 4) % 12 // index为命宫索引, 命宫索引+4得到第一个三会宫的索引
p2 = (index + 8) % 12 // 命宫索引+8得到第二个三会宫的索引
p3 = (index + 6) % 12 // 命宫索引+6得到对冲宫位的索引
如果要画出戌(在十二地支中的索引为10)宫的三方四正指示线,只需像下面这样调用划线函数:
drawDashedLine(ctx, 10);
4、在实际应用到紫微斗数排盘程序中时,可以将命宫索引作为模版渲染参数传入,在jinja2模版文件中以如下方式调用划线函数即可在画天盘以及飞星时灵活画出三方四正指示线:
drawDashedLine(ctx, {{index}});
5、利用下面两行代码可以设定Canvas上下文的笔触为透明度50%的蓝色虚线:
// 设置虚线样式
ctx.setLineDash([5, 5]);
// 设置透明度为50%的蓝色
ctx.strokeStyle = "rgb(0 0 255 / 50%)";
浮动Canvas使之与命盘形成层次堆叠关系,设计出灵活的划线函数,确定十二地支宫的连线点,是在紫微斗数命盘上画出三方四正指示线的关键。
相关文章:
利用Canvas在紫微斗数命盘上画出三方四正
许多紫微斗数排盘程序都会在命盘上画出三方四正的指示线,便于观察命盘。本文用Canvas在一个模拟命盘上画出三方四正指示线。 模拟命盘并画出“子”宫三方四正的HTML文件如下: <!doctype html> <html lang"en"> <head><…...
传统汽车 HMI 设计 VS 新能源汽车 HMI 设计,有何不同?
一、设计理念与目标的差异 传统汽车HMI设计的核心目标是辅助驾驶,强调功能的简洁性和操作的便捷性。其设计侧重于提供基础的车辆信息(如车速、转速、油量等),并确保驾驶员在操作时能够快速获取关键信息。相比之下,新能…...
【JavaWeb】前端基础
JavaWeb 前端三大件:HTML(主要用于网页主体结构的搭建),CSS(页面美化),JavaScript(主要用于页面元素的动态代理) 1. HTML 1.1 html概述 HTML:Hyper Text …...
SpringMVC组件解析
SpringMVC的执行流程 ① 用户发送请求至前端控制器DispatcherServlet。 ② DispatcherServlet收到请求调用HandlerMapping处理器映射器 ③ 处理器映射器找到具体的处理器(可以根据xm|配置、注解进行査找),生成处理器对象及处理器 拦截器(如果有则生成)一…...
使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例
1. 使用 Provider 实现局部刷新 示例 1:ChangeNotifier Consumer 通过 ChangeNotifier 和 Consumer 实现局部刷新。 import package:flutter/material.dart; import package:provider/provider.dart;void main() {runApp(ChangeNotifierProvider(create: (_) &g…...
数据结构C语言练习(两个栈实现队列)
一、引言 在数据结构的学习中,我们经常会遇到一些有趣的问题,比如如何用一种数据结构去实现另一种数据结构的功能。本文将深入探讨 “用栈实现队列” 这一经典问题,详细解析解题思路、代码实现以及每个函数的作用,帮助读者更好地…...
Java 基础-28- 多态 — 多态下的类型转换问题
在 Java 中,多态(Polymorphism)是面向对象编程的核心概念之一。多态允许不同类型的对象通过相同的方法接口进行操作,而实际调用的行为取决于对象的实际类型。虽然多态提供了极大的灵活性,但在多态的使用过程中…...
nextjs使用02
并行路由 同一个页面,放多个路由,, 目录前面加,layout中可以当作插槽引入 import React from "react";function layout({children,notifications,user}:{children:React.ReactNode,notifications:React.ReactNode,user:React.Re…...
第2.6节 iOS生成全量和增量报告
2.6.1 简介 在采集了覆盖率数据后,就需要生成对应需求的全量和增量覆盖率报告,以便对测试进行查漏补缺。IOS系统有两种开发语言,所以生成报告的方式也不相同,下面就分别介绍一下Object C和Swift语言如何生成覆盖率报告。 2.6.2 O…...
应用分享 | AWG技术突破:操控钻石氮空位色心,开启量子计算新篇章!
利用AWG操作钻石中的氮空位色彩中心 金刚石中的颜色中心是晶格中的缺陷,其中碳原子被不同种类的原子取代,而相邻的晶格位点则是空的。由于色心具有明亮的单光子发射和光学可触及的自旋,因此有望成为未来量子信息处理和量子网络的固态量子发射…...
前端开发学习路线完整指南
前端开发学习路线完整指南 前端开发是一个不断发展的领域,涉及多个技术栈。本文将为你提供一条系统的前端学习路线,帮助你从零基础到熟练掌握前端开发技能。 1. 前置知识 在学习前端之前,了解一些基础知识会对你的学习过程有很大帮助。 计…...
linux服务器专题2------vim编辑器如何设置显示行号
在 Vim 编辑器中,可以通过以下步骤来显示行号: 临时显示行号 打开 Vim 编辑器,输入如下命令: :set number这将临时启用行号显示。关闭 Vim 后,行号设置将丢失。 永久显示行号 如果希望在每次启动 Vim 时都显示行号…...
Jmeter触发脚本备份
JMeter 在以下情况会触发脚本备份: 手动保存测试计划时:如果测试计划有未保存的修改,当用户手动保存测试计划(脚本)时,JMeter 都会自动将当前脚本备份到${JMETER_HOME}/backups文件夹下。 关闭 JMeter 时…...
【视觉与语言模型参数解耦】为什么?方案?
一些无编码器的MLLMs统一架构如Fuyu,直接在LLM内处理原始像素,消除了对外部视觉模型的依赖。但是面临视觉与语言模态冲突的挑战,导致训练不稳定和灾难性遗忘等问题。解决方案则是通过参数解耦方法解决模态冲突。 在多模态大语言模型…...
重建二叉树(C++)
目录 1 问题描述 1.1 示例1 1.2 示例2 1.3 示例3 2 解题思路 3 代码实现 4 代码解析 4.1 初始化 4.2 递归部分 4.3 主逻辑 5 总结 1 问题描述 给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。 例如输入前序遍历序…...
VLAN、QinQ、VXLAN的区别
1、技术本质与封装方式 技术OSI层级封装原理标识位长度拓展性VLAN数据链路层L2在以太网帧头插入802.1Q Tag(单层VLAN标签)12位(4094个)有限,仅支持单一网络域内隔离QinQ数据链路层L2在原始VLAN标签外再封装一层802.1Q…...
保姆级教程:synchronized 同步方法 vs 同步代码块,看完彻底懂锁!
一、同步方法(锁住整个方法) 1. 代码示例 public class Counter {private int count 0;// 同步方法:锁住整个方法public synchronized void add() {count;}// 同步方法:锁住整个方法public synchronized void subtract() {coun…...
10乱码问题的解释(1)
在计算机中,一个汉字,占几个字节? 针对这个问题,只要你回答出一个具体的数字,就一定是错的!! 前提条件: 当前中文编码使用的是哪种方式(字符集) 计算机存的其实是二进制数字~~ 英文字母,怎么表示的?? ASCII 码表~~ 规定了每个字符,都有一个对应的数字来表示~~ 只是表示英文,…...
短视频文案--钓鱼女和滑板女
短视频文案 第一个文案: 1标题:风萧萧兮易水寒,美女钓鱼兮不复还 2内容: 我站在池边的微风中,再也看不到曾经快乐的少女了。 风很凉,凉得心不知前往何处。 水很清,清得深知这里没鱼群。 芦苇…...
算法设计学习3
实验目的及要求: 1.加强对结构体的应用。 2.熟悉字符计数排序。 实验设备环境: 1.微型计算机 2.DEV C(或其他编译软件) 实验步骤: 任务:要求使用自定义函数来实现 输入一段文本,统计每个字符出现的次数,按…...
nginx的自动跳转https
mkdir /usr/local/nginx/certs/ 创建一个目录 然后用openssl生成证书 编辑nginx的配置文件 自动跳转成功 做一个优化,如果访问的时候后面加了其他的uri也一起自动跳转了...
python-leetcode 62.搜索插入位置
题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置 方法一:二分查找 假设题意是在排序数组中寻找是否存在一个目标值,则可以…...
2. ollama下载及安装deepseek模型
ollamam 1. ollama2. ollama常用命令3. Windows配置Ollama与DeepSeek自定义目录环境3.1 自定义安装3.3 添加到系统变量 1. ollama 官网地址 下载地址 测试安装 deepseek模型下载地址 根据电脑性能下载对应版本 2. ollama常用命令 # 运行模型 ollama run 模型 # 查看模型…...
deepseek使用记录26——思维混乱背后的理论泡沫与骗局
一 后现代主义哲学自20世纪60年代兴起以来,其理论形态和社会影响一直备受争议。支持者认为它是对现代性弊病的批判和解构,而反对者则将其视为一种脱离现实的“工业化学术生产”,甚至是一场哲学骗局。结合相关文献和案例,可从以下角…...
服务器入门操作1(深度学习)
服务器相关 基本命令 查看GPU状态: 查看GPU信息查看CPU信息查看系统版本号 nvidia-smi lscpu lsb_release -a清屏: clearanaconda相关: 查看环境列表激活虚拟环境退出虚拟环境跳转至目录跳转至上一级目录 conda env list conda activa…...
Qt基本框架(1)
本篇主要介绍Qt的基本框架,并实现简单的按钮事件 本文部分ppt、视频截图原链接:[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. Qt基本框架介绍 Qt基本框架主要分为两部分:Qt实例对象和Qt窗口。Qt实例对象负责初始化Qt运行时…...
Buzz1.2.0视频语音转成TXT、SRT、VTT工具
buzz0.9.0.exe下载 https://download.csdn.net/download/u011000529/90551347 特征 导入音频和视频文件并导出文本到 TXT、SRT 和 VTT从您计算机的麦克风转录和翻译成文本(资源密集型且可能不是实时的,Demo)支持Whisper、 Whisper.cpp、Fast…...
动手学深度学习:AlexNet
前言 从这个模型开始,我的数据集主阵地就将从装甲板转移到手语视频数据集,模型开始变得更加复杂,数据集当然也要更复杂啦,我将记录在这个过程中遇到的问题和解决后续。 数据读取 由于是视频数据集,我采取的方法是将…...
MySql之binlog与数据恢复(Binlog and Data Recovery in MySQL)
MySql之binlog与数据恢复 什么是binlog binlog我们一般叫做归档日志,他是mysql服务器层的日志,跟存储引擎无关,他记录的是所有DDL和DML的语句,不包含查询语句,binlog是一种逻辑日志,他记录的是sql语句的原…...
JDK1.8和Maven、Git安装教程自用成功
一.JDK安装 JRK:java运行环境 JDK:java语言的软件开发工具包;JDK里包含了java开发工具,也包含了JRE 1.下载JDK1.8并安装 Java Downloads | Oracle 进入官网后往下翻,找到JAVA8; 然后选择对应的版本&am…...
