UE4C++UI平滑曲线图绘制

2023-05-16

UE4C++UI平滑曲线图绘制

  • 前言
    UE4的曲线在UMG上面绘制的时候总是和麻烦的,这里我们采用UE4曲线FRichCurve中的绘制方法,传入对应的Key值,然后差值获取俩个点之间的数据,然后将所有点连接则是对应的平滑曲线。(此处没计算,用的FRichCurve中所自带点的计算),逻辑比较简单,再次不过多赘述。

附源码:

  • .h文件
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "SmoothedLineWidget.generated.h"

/**
 *
 */
UCLASS()
class SPECIALCHART_API USmoothedLineWidget : public UUserWidget
{
	GENERATED_BODY()

public:
	USmoothedLineWidget(const FObjectInitializer& ObjectInitializer);
	
	UFUNCTION(BlueprintCallable)
		void SetValues(TArray<float> InValues);//计算对应的key值,默认在绘制前已调用
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		FVector2D Size= FVector2D(100,100);//大小
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		FVector2D Locationn = FVector2D(100, 100);//位置
	UPROPERTY(EditAnywhere,BlueprintReadWrite)
		float BrushSize=5;//笔刷大小
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		FColor Color;//颜色
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		TArray<float> Values;//传入的线对应的值
	virtual void NativePreConstruct() override;
protected:
	virtual int32 NativePaint(
		const FPaintArgs& Args,
		const FGeometry& AllottedGeometry,
		const FSlateRect& MyCullingRect,
		FSlateWindowElementList& OutDrawElements,
		int32 LayerId,
		const FWidgetStyle& InWidgetStyle,
		bool bParentEnabled) const override;//绘制函数

private:
	void DrawSmoothedLine(
		FSlateWindowElementList& OutDrawElement,
		int InLayerId,
		const FGeometry& InAllottedGeometry,
		TArray<FVector2D> InPoints,
		float InThickness,
		FColor InColor
	)const;//线的绘制
	//线所包含的顶点
	TArray<FVector2D> MultiplyPoint;
};
  • .cpp文件
// Fill out your copyright notice in the Description page of Project Settings.


#include "SmoothedLineWidget.h"
#include "Components/CanvasPanelSlot.h"


USmoothedLineWidget::USmoothedLineWidget(const FObjectInitializer& ObjectInitializer)
	:Super(ObjectInitializer)
{
}

void USmoothedLineWidget::SetValues(TArray<float> InValues)
{
	if (InValues.Num() < 2)
		return;

	MultiplyPoint.Empty();

	float WidgetWidth = Size.X;
	float WidgetHeight = Size.Y;

	float Space = WidgetWidth / (InValues.Num() - 1);
	for (int32 Index = 0; Index < InValues.Num(); Index++)
	{
		FVector2D KeyPosition(Space * Index, WidgetHeight - InValues[Index]);
		MultiplyPoint.Add(KeyPosition);
	}
}

void USmoothedLineWidget::NativePreConstruct()
{
	Super::NativePreConstruct();
	SetValues(Values);
}

int32 USmoothedLineWidget::NativePaint(const FPaintArgs& Args,
                                       const FGeometry& AllottedGeometry,
                                       const FSlateRect& MyCullingRect,
                                       FSlateWindowElementList& OutDrawElements, 
                                       int32 LayerId,
                                       const FWidgetStyle& InWidgetStyle,
                                       bool bParentEnabled) const
{
	DrawSmoothedLine(
		OutDrawElements,
		LayerId,
		AllottedGeometry,
		MultiplyPoint,
		BrushSize,
		Color);
	return LayerId++;
}

void USmoothedLineWidget::DrawSmoothedLine(
	FSlateWindowElementList& OutDrawElement,
	int InLayerId,
	const FGeometry& InAllottedGeometry,
	TArray<FVector2D> InPoints,
	float InThickness,
	FColor InColor) const
{
	if (InPoints.Num() < 2)
		return;

	FRichCurve* RichCurve = new FRichCurve();

	for (FVector2D InPoint : InPoints)
	{
		FKeyHandle KeyHandle = RichCurve->AddKey(InPoint.X, InPoint.Y);
		RichCurve->SetKeyInterpMode(KeyHandle, ERichCurveInterpMode::RCIM_Cubic);
	}

	UCanvasPanelSlot* CanvsdPanelSlot = Cast<UCanvasPanelSlot>(this->Slot);


	TArray<FVector2D> ResultPoints;
	

	float WidgetWidth = Size.X;
	float WidgetHeight = Size.Y;
	int32 Begin = 0;
	int32 End = (int32)WidgetWidth;
	for (int32 X = Begin; X < End; X++)
	{
		float Y = RichCurve->Eval(X);
		FVector2D ResultPoint(X+ Locationn.X, Y+ Locationn.Y);
		ResultPoints.Add(ResultPoint);
	}

	delete RichCurve;

	FSlateDrawElement::MakeLines(
		OutDrawElement,
		InLayerId,
		InAllottedGeometry.ToPaintGeometry(),
		ResultPoints,
		ESlateDrawEffect::None,
		InColor,
		true,
		InThickness
	);
}

在这里插入图片描述

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

UE4C++UI平滑曲线图绘制 的相关文章

  • uni-app实现全局组件注册

    uni app 全局注册组件三种方式 1 传统vue组件需要创建 引用 组成三个步骤 2 在page json中对应page设置 34 globalStyle 34 34 autoscan 34 true 和pages同级 3 HBuild
  • Vue--混入(Mixin)

    Vue 混入 Mixin 当不同组件有相同功能时 xff0c 不必重复定义属性和方法 xff0c 可使用vue中的混入 Mixin 来分发 Vue 组件中的可复用功能 一个 mixin 对象可以包含任意组件选项 xff0c 即data me
  • uni-app--tabs切换swiper

    父组件 span class token operator lt span template span class token operator gt span span class token operator lt span view
  • 关于移动端 html5诸多事件

    1 点击事件 64 click与 64 tap的区别 xff1a 64 click 在web手机端上点击 xff0c 有300ms延迟再被触发 64 tap具有事件穿透特点 而 64 click没有 事件冒泡 xff1a 当父元素有点击事件
  • vuex状态管理

    vue 1 下载vuex依赖 2 创建store目录store js xff0c 然后在js中引入 span class token keyword import span span class token module Vue span
  • Jmeter性能测试(8)--断言

    jmeter xff08 8 xff09 断言 jmeter中有个元件叫做断言 xff08 Assertion xff09 xff0c 它的作用和loadrunner中的检查点类似 xff1b 用于检查测试中得到的响应数据等是否符合预期 x
  • Class类

    class类的基本写法 es6引入了class类的概念 xff0c 可通过class关键字来定义类每个类都会有一个构造函数 xff0c 即constructor 方法 xff0c 用于创建和初始化class对象要注意 xff0c 如果一个类
  • install与directive

    install Vue option Vue js提供install方法 xff0c 可用于开发新插件以及全局注册组件等 span class token keyword export span span class token keywo
  • STC15W4K56S4学习笔记——LCD12864滚动显示

    STC15W4K56S4学习笔记 LCD12864滚动显示 最近在准备学校的单片机校赛 xff0c 重新回顾了一遍51单片机 xff0c 上手了STC15W4K56S4试验箱 xff0c 写一些笔记来记录一下 xff0c 水平有限 xff0
  • STM32用XCOM调试助手打印不出数据

    STM32用XCOM调试助手打印不出数据 被困扰了一段时间的串口终于解决了 xff0c 用STM332F103ZET6写串口 xff0c 但是不懂为什么打开串口调试助手就是打印不出数据 首先检查了代码有没有错 xff0c 因为是按照网上的代
  • OpenCV-python学习笔记(十二)——图像轮廓

    十二 图像轮廓 图像轮廓是指将边缘连接起来形成的一个整体 xff0c 用于后续的计算 因为边缘检测得到的边缘是不连续的 查找图像内的轮廓信息 xff1a cv2 findContours 绘制轮廓 xff1a cv2 drawContour
  • k210——maix bit串口通信

    k210 串口通信 k210 一共有3个 uart xff0c 每个 uart 可以进行自由的引脚映射 一 API函数介绍 1 1 register pin function force 61 True K210 可以通过映射来改变引脚功能
  • k210——Maixhub 云端模型训练

    k210 Maixhub 云端模型训练 一 前言 k210的模型训练可以在Maixhub 上进行 xff0c 只需要准备好需要训练的数据集 xff0c 不需要搭建训练环境和代码 xff0c 上传训练数据即可快速训练出模型 Maixhub 有
  • 自动控制原理MATLAB常用函数总结

    自动控制原理MATLAB常用函数总结 一 控制系统的数学模型 1 传递函数数学模型 G xff08 s xff09 61
  • MCS-51汇编软件实验

    MCS 51汇编软件实验 实验一 内存块移动 将指定源地址和长度的存储块移到指定目标地址为起始地址的单元中去 移动3000H起始的256个字节到4000H起始的256个字节 代码示例 xff1a ORG 0000H MOV DPTR 300
  • Jmeter性能测试(9)--逻辑控制器

    jmeter中逻辑控制器 xff08 Logic Controllers xff09 的作用域只对其子节点的sampler有效 xff0c 作用是控制采样器的执行顺序 jmeter提供了17种逻辑控制器 xff0c 它们各个功能都不尽相同
  • MapReduce的工作流程:map和reduce分别做了哪些工作,以及shuffle机制实现了什么

    一 map和reduce分别做了哪些工作 Map 待处理数据分片放入缓冲区 xff0c 分区 排序 合并 归并 xff0c 写入本地磁盘 将处理杂乱无章的数据 xff0c 找出规律 xff0c 归纳处理 1 读取hdfs上的文件 xff0c
  • Prometheus监控部署

    文章目录 一 通用监控系统基础知识以及Prometheus的概述1 监控系统的发展史 xff1a 2 什么是Prometheus 二 工作原理及适用性1 prometheus获取数据的方式 三 xff0c 实验环境1 关闭防火墙和核心防护P
  • Docker之 神操作!居然能修改已运行的 Docker 容器端口映射

    文章目录 一 容器未启动 xff1f 二 容器已启动 xff1f 2 1 但是想修改或者添加端口时 xff0c 先停止掉正在运行的容器 2 2 查看容器完整的 96 hash of the container 96 数值 xff1a 2 3
  • python版MapReduce基础实战

    第一关 xff1a 成绩统计 任务描述 本关任务 xff1a 使用Map Reduce计算班级中年龄最大的学生 相关知识 为了完成本关任务 xff0c 你需要掌握 xff1a 1 什么是MapReduce xff0c 2 如何使用MapRe

随机推荐

  • 视觉SLAM十四讲笔记六(第七讲)

    1 引言 前几节介绍了运动方程和观测方程的具体形式 xff0c 并讲解了以非线性优化为 主的求解方法 本讲 xff0c 我们将介绍什么是特征点 xff0c 如何提取和匹配特征点 xff0c 以及如何根据配对的特征点估计相机运动 2 特征点法
  • [C++教程①]--了解c语言以及第一行代码

    hellohello xff0c 我是离 今天开始 xff0c 我会对小白朋友讲解c 43 43 C 43 43 是什么 C 43 43 是C语言的继承 xff0c 它既可以进行C语言的过程化程序设计 xff0c 又可以进行以抽象数据类型为
  • 虚拟机可以ping通IP,但是ping通不了域名

    今天用VMware安装了一个centos7系统 xff0c 正常安装上去 xff0c 编辑了ifcfg ens33网卡信息 在物理机上ping虚拟机地址和百度的域名 xff0c 测试可以ping通 又去虚拟机上ping一下百度域名www b
  • 笔记(STM32篇)day12——USART串口介绍、串口初始化结构体

    目录 一 USART介绍 1 USART简介 2 USART功能框图 二 串口初始化结构体 参考 一 USART介绍 1 USART简介 通用同步异步收发器 Universal Synchronous Asynchronous Receiv
  • 京东Java后台开发岗社招面试经验分享,4面的面经!

    前言 正好最近我一朋友面试京东回来 xff0c 和我聊了他的面试经过 xff0c 最后经过四面成功斩获offer xff01 下面我把他所得经验毫无保留的分享给大家 xff01 希望对正准备面试小伙伴们能有所帮助 xff01 xff01 x
  • 关于系统架构

    系统架构 1 系统架构包括什么形式2 C S架构2 1 C S架构的软件或者系统2 2 C S架构的特点2 3 C S架构的优缺点 3 B S架构3 1 优缺点3 2 B S结构的系统的通信原理关于域名 4 WEB服务器软件4 1 WEB服
  • Jmeter性能测试(10)--参数化

    参数化是自动化测试脚本的一种常用技巧 简单来说 xff0c 参数化的一般用法就是将脚本中的某些输入使用参数来代替 xff0c 在脚本运行时指定参数的取值范围和规则 xff1b 这样 xff0c 脚本在运行时就可以根据需要选取不同的参数值作为
  • AT指令1

    我之前认为手机号码与SIM卡是一一对应的 xff0c 后来想想不对 xff0c 因为有换卡不换号的情况啊 xff0c 所以SIM卡应该只是一个电话号码的储存介质 xff0c 而与SIM卡一一对应的是另一个编码 IMSI xff08 国际移动
  • Keil5 的常见错误

    1 C Source led c 22 warning 69 D integer conversion resulted in truncation 这个是由于实际值的范围超过了定义值的范围 2 C Source main c 15 err
  • c语言实现FTP

    这个实现了客户端和服务端文件的相互传输 xff08 只在本机上运行过 xff09 xff0c 如果是要两台计算机相互传数据要改ip 给大家看一下实现过程 xff08 exe文件要先开服务端的 xff09 输入1 直接将快捷方式拖拽上去就有绝
  • 2021 => 手把手搭建dhcp服务(详细)

    架构解析 dhcp服务器配置 配置实验环境 关闭VMware的dhcp服务 给虚拟机添加网卡为VMnet1 安装与配置dhcp服务 给新添的网络配置IP 配置dhcp服务 在真实的主机系统上查看dhcp配置 为真实主机系统分配固定的IP 修
  • 2021 => 手把手教你NFS部署(实用)

    NFS服务 原理 xff1a 供文件共享服务 为Web Server 配置集群中的后端存储 支持多节点同时挂载以及并发送与写入 架构解析 这是一张大型网站高并发架构图 xff0c 我们只需注意图中圈红的地方 建立NFS文件系统本质就是用来进
  • 2021最新阿里云部署k8s集群(篇1 购买服务器)

    实验kubernetes版本 xff1a v1 22 1 x1f947 阿里云地址 阿里云开发者社区 阿里云官网开发者社区 云计算社区 注意 xff1a 做此实验先准备100RM xff0c 本实验为抢占实例 CentOs版本 xff1a
  • 七层负载均衡HAproxy生产环境LVS+Keepalived+HAproxy(三)

    LB Haproxy Nginx x1f4af 解析 xff1a 七层负载均衡器 xff0c 为与七层模型上的应用层 xff0c 通过URL地址 xff08 应用层 xff09 进行负载均衡 优点 xff1a 详细地址 xff0c 数据精准
  • Kubeadm-K8s1.20-高可用部署-详细-生产环境(四)

    文章目录 kubeadm部署高可用集群注意事项k8s部署 二进制与高可用的区别 一 环境配置1 所有节点修改主机名2 所有节点进行域名解析3 所有节点关闭相关应用3 1 防火墙关闭3 2 dnsmasq关闭3 3 NetworkManage
  • k8s Pod简介与探针实现零宕机发布

    目录 一 Pod简介 Pod的退出流程 1 什么是Pod 2 定义一个Pod 二 探针 零宕机发布 1 Pod探针 2 Pod探针的检测方式 3 探针检查参数配置 4 startupProbe 5 liveness 6 readiness
  • VmWare克隆 CentOS7

    问题1 xff1a 无法启动图形化界面 背景 xff1a 搭建 Zookeeper 集群需要多台服务器 xff0c 于是参考 VmWare 克隆 CentOS7 xff0c 但是克隆后启动无法进入 图形化界面 报错现象 xff1a 分析过程
  • 【Opencv】CV_* was not declared in this scope 的部分解决方法

    问题描述及原因分析 Opencv在更新到 新版本 后 xff0c 在运行有些 旧版本 的代码时会出现此类情况 解决方案 xff1a error CV AA was not declared in this scope 在头文件中添加 inc
  • Jmeter性能测试(11)--JDBC Request之Query Type

    工作中遇到这样一个问题 xff1a 需要准备10W条测试数据 xff0c 利用jmeter中的JDBC Request向数据库中批量插入这些数据 xff08 只要主键不重复就可以 xff0c 利用函数助手中的Random将主键的ID末尾五位
  • UE4C++UI平滑曲线图绘制

    UE4C 43 43 UI平滑曲线图绘制 前言 UE4的曲线在UMG上面绘制的时候总是和麻烦的 xff0c 这里我们采用UE4曲线FRichCurve中的绘制方法 xff0c 传入对应的Key值 xff0c 然后差值获取俩个点之间的数据 x