C#贝塞尔曲线的应用-未读红点拖拽粘连效果

2023-10-31

前言

提示:仿照手机qq未读红点拖拽粘连效果

贝塞尔曲线的应用非常广泛,本篇文章将使用Winform贝塞尔曲线来实现QQ未读红点拖拽粘连的效果


手机QQ粘连效果

在这里插入图片描述

最终实现的效果

在这里插入图片描述

分析效果

  • 1.可以看出随着拖拽的距离变大,固定点的圆会逐渐变小
  • 2.粘连效果是一个由两个小球边缘位置贝塞尔曲线构成,所以需要计算出两个小球边缘的点 A,B,C,D和两条贝塞尔曲线的控制点E,F
    在这里插入图片描述

核心公式

计算按下的位置到中心点的距离

通过公式c^2 = a^2+b^2 带入到代码为

// 计算两点距离公式  c^2 = a^2+b^2
int y2 = mouse_point.Y - (this.Height / 2);
int x2 = mouse_point.X - (this.Width / 2);
distance = Math.Sqrt(y2 * y2 + x2 * x2);

计算出按下位置到中心点的角度

 // 计算角度公式
degree = Math.Atan2(y2, x2) * 180 / Math.PI;
Console.WriteLine(degree);

边缘点的计算

边缘的点的可以用三角函数公式计算得到

在这里插入图片描述

// 小球一侧的点
var angle = (degree + 90) / 180 * Math.PI;
float x1 = Convert.ToSingle(radius * 0.5f * Math.Cos(angle) + (this.Width / 2));
float y1 = Convert.ToSingle(radius * 0.5f * Math.Sin(angle) + (this.Height / 2));

// 另一侧的点
var angle2 = (degree - 90) / 180 * Math.PI;
float x2 = Convert.ToSingle(radius * 0.5f * Math.Cos(angle2) + (this.Width / 2));
float y2 = Convert.ToSingle(radius * 0.5f * Math.Sin(angle2) + (this.Height / 2));

贝塞尔控制点的计算

两个控制点的位置刚刚在球心连线的1/4和3/4处

// 两个圆之间的1/4 和 3/4 点,就是三阶贝塞尔的两个控制点
var angle3 = degree / 180 * Math.PI;
float control_x1 = Convert.ToSingle(distance * 0.25f * Math.Cos(angle3) + (this.Width / 2));
float control_y1 = Convert.ToSingle(distance * 0.25f * Math.Sin(angle3) + (this.Height / 2));

float control_x2 = Convert.ToSingle(distance * 0.75 * Math.Cos(angle3) + (this.Width / 2));
float control_y3 = Convert.ToSingle(distance * 0.75 * Math.Sin(angle3) + (this.Height / 2));

完整代码

本效果有使用C#语言实现,其他语言道理相同

1.创建自定义控件 重写OnMouseDown OnMouseUp OnMouseMove 方法来获取当前鼠标响应的事件
2.重写控件的OnPaint方法, 绘制出中心点和鼠标按下的点
3.使用GraphicsPath 添加贝塞尔曲线,并连接各点,填充实现


点这里下载完整源码

在这里插入图片描述

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

C#贝塞尔曲线的应用-未读红点拖拽粘连效果 的相关文章

随机推荐

  • 记录ViewPager+fragment 内存泄露问题

    首先是检测内存泄露的最大利器 Leakcanary 依赖和接入很是简单 debugImplementation com squareup leakcanary leakcanary android 1 6 3 releaseImplemen
  • 计算机顶级会议的历年最佳文章 (1996-2013)

    本人博客地址 http blog csdn net wanrenwangxuejing Best Paper Awards in Computer Science since 1996 By Conference AAAI ACL CHI
  • SmartFusion从FPGA到ARM(一)——MSS_GPIO点灯

    文章目录 前言 0 开发环境准备 1 创建一个基本工程 2 配置MSS模块 3 生成示例工程 4 Keil编译ARM工程 5 FPGA工程加载Hex文件 6 下载运行 7 JTAG SEL管脚说明 示例工程下载 前言 本系列教程 将会以Sm
  • 【Redis】数据结构---String

    文章目录 String 字符串 1 Redis 键 key 2 String 字符串 2 1常用命令 2 2 String底层结构 3 空间分配策略 3 1空间预分配 3 2惰性空间释放 3 3为什么SDS的最大长度是512M 4 SDS面
  • MySQL Community Server的安装配置教程(Windows版本)

    1 了解MySQL Community Server MySQL Community Server是开源的MySQL数据库服务的名称 它是MySQL AB在2000年推出的一个开源数据库服务器 现在由Oracle公司维护和管理 MySQL
  • mac 升级系统到 bigsur navicat 打不开 找回本地保存的查询sql文件

    1 建议直接下载新版navicat https macwk com soft navicat premium 2 或者手动搜 直接访达搜navicat 搜到的目录里挨个进去看看 我的文件是在下面找到的 Navicat CC Common S
  • 毕设学习(一)——三相并网逆变器的simulink仿真

    毕设学习 一 三相并网逆变器的Simulink仿真 本系列将记录我的毕设学习过程 同时分享我的学习内容 欢迎大家讨论交流 如有错误还望大佬指正 文章目录 毕设学习 一 三相并网逆变器的Simulink仿真 前言 一 三相并网逆变器 二 Si
  • C 51单片机串口控制LED

    实验名称 串口控制LED和蜂鸣器 接线说明 实验现象 下载程序后 由串口助手以HEX格式发送如下命令控制LED和蜂鸣器 D1指示灯亮发送 11 0D 0A D1指示灯灭发送 10 0D 0A 蜂鸣器响发送 21 0D 0A 蜂鸣器停发送 2
  • pycharm如何找到python解释器,pycharm找不到解释器怎么办

    解决方法 1 打开磁盘 直接搜索python exe文件 获取该文件的路径 2 打开pycharm软件 依次点击 File Setting Project 点击右上角的设置图标 3 按照获取的路径找到python exe即可 IDi少儿编程
  • 谷粒学院SpringSecurity认证流程详解

    登录功能前端分析 前端会调用此接口去实现登录 登录 export function login username password return request url admin acl login method post data us
  • protobuf ubuntu 18.04环境下安装

    t20190518 luo luo All Series MyFile t20190518 luo luo All Series MyFile t20190518 luo luo All Series MyFile t20190518 lu
  • sharding-jdbc行分片策略默认不支持按分片键的范围查询

    目录 sharding jdbc行分片策略默认不支持按分片键的范围查询 原因 使用行分片策略 解决方案 使用标准分片策略 sharding jdbc 分片策略 sharding jdbc行分片策略默认不支持按分片键的范围查询 在开发时 对主
  • 网络空间安全概论 第八章 作业

    返回 本次得分为 12 00 16 00 本次测试的提交时间为 2020 02 15 如果你认为本次测试成绩不理想 你可以选择再做一次 1 判断 2分 在iOS的安全机制中 具有代表性的有权限分离 强制代码签名 地址空间随机分布和沙盒 由于
  • android AudioRecord

    AudioRecord是Android中用于音频录制的类 它的主要作用是捕获来自设备麦克风或其他音频源的音频数据 并将其保存为PCM格式的音频流 以供后续处理或存储 以下是关于AudioRecord的一些常见用途和基本使用方法 作用和用途
  • 国际化之表单校验

    国际化之表单校验 国际化整个项目的时候 表单校验的提示是个麻烦的事情 很多资料说用vee validate插件来实现这个功能 但是我觉得有点麻烦 不是很想用插件 然后就在validate js里面去捣鼓 然后发现在我们校验方法下是可以获取到
  • 数据库的事务

    以MySQL为视角 了解数据库的事务 目录 一 事务简介 1 概念 2 操作 3 例子 4 事务提交方式 二 事务的四大特征 ACID 1 原子性 atomicity 2 一致性 consistency 3 隔离性 isolation 4
  • Python: 用于计算txt文档的字数的小脚本

    在一次实践中 需要计算txt文档 英文和数字 的字数 并且还要统计路径下的所有txt文档的字数总数 本来以为很简单 但是在编写的过程中还是出现了一些问题 首先就是 字数和字符数是不一样的 不能简单的用len 根据英文的特性 每个单词都需要空
  • VUE iscroll

    https github com Dafrok vue iscroll view 基本使用方法 npm i vue iscroll view save dev npm i iscroll save dev import IScrollVie
  • uniapp scroll-view 隐藏滚动条

    如果是想全局隐藏的话 可以放在App vue中 如果是局部则在对应的页面中引入使用即可 ifdef MP WEIXIN APP PLUS webkit scrollbar display none width 0 important hei
  • C#贝塞尔曲线的应用-未读红点拖拽粘连效果

    前言 提示 仿照手机qq未读红点拖拽粘连效果 贝塞尔曲线的应用非常广泛 本篇文章将使用Winform贝塞尔曲线来实现QQ未读红点拖拽粘连的效果 手机QQ粘连效果 最终实现的效果 分析效果 1 可以看出随着拖拽的距离变大 固定点的圆会逐渐变小