UE5中绘制饼状图

news2024/11/8 21:37:34

饼状图

  • 使用UE绘制前提
  • 完整的创建过程
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 6
    • 7
    • 8
  • 附录代码
    • .h代码
    • .c代码

使用UE绘制前提

EPIC Game使用的版本是Unreal Engine 5.0.3。
没有使用其他额外的插件,使用的是C++和Ui共同绘制。
C++编译器使用的是VS2019。

完整的创建过程

1

首先在UE中随意一种项目的白色。默认为C++,名称注意使用英文
在这里插入图片描述

2

在这里插入图片描述

3

在这里插入图片描述

4

之后就直接跳进VS2019中去了。然后将附录中的代码整上去。先保存后编译一定要先保存后编译
在这里插入图片描述
上面的报错全都无伤大雅,真正的检查是在Live Coding 中
但是如果有其他的报错还是要研究分析一下,比如中英文错了等等。不再多提。

5

完成VS2019中的编码后使用的检测系统如下图所示,快捷键是Ctrl + Alt + F11。
如果Live Coding中显示Successfully,那么就成功了
在这里插入图片描述

6

在进入到UE中新建一个UI控件
在这里插入图片描述

6

在这里插入图片描述

7

控件蓝图中放入画布画板再将你自己命名的用户控件放入其中
在这里插入图片描述

8

在右上角点击转移到图表中去,然后连线如下
在这里插入图片描述
运行后如下
在这里插入图片描述
也可以进行更改,让他显示两个饼图

在这里插入图片描述
在这里插入图片描述
颜色大小都可以自定义来实现。

附录代码

.h代码

.h文件代码如下

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once
#include <fstream>
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "PieWidget.generated.h"

/**
 * 
 */
UCLASS()
class ECHART1_API UPieWidget : public UUserWidget
{
	GENERATED_BODY()


public:
	UFUNCTION(BlueprintCallable)
	void SetValues(TArray<float> InValues);

	UFUNCTION(BlueprintCallable)
		void SetColor(TArray<FLinearColor> InColors);
protected:
	virtual int32 NativePaint(
		const FPaintArgs& Args,
		const FGeometry& AllottedGeometry,
		const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId,
		const FWidgetStyle& InWidgetStyle,
		bool bParentEnabled) const;
private:
	//私有的绘制扇形所需元素从上到下依次是
	//绘制所需元素,绘制所需几何,所需元素,圆心所在,半径,圆心开始角度,结束角度,颜色
	void DrawFan(
		FSlateWindowElementList& OutDrawElements,
		const FGeometry& AllottedGeometry,
		int32 Layer,
		const FVector2D& CenterPosition,
		float Radius,
		int32 BeginAngle,
		int32 EndAngle,
		FColor Color
	)const;

	TArray<int32> Angles;
	TArray<FLinearColor> Colors;

	FColor GetColorByIndex(int32 InIndex)const;
};

.c代码

.c文件如下

#include "PieWidget.h"


void UPieWidget::SetValues(TArray<float> InValues)
{
	if (InValues.Num() < 1)
		return;
	Angles.Empty();

	Angles.Add(0);

	//求取数据的总值
	float Total = 0;
	for (int32 Index = 0; Index < InValues.Num(); Index++)
	{
		Total += InValues[Index];
	}
	//求取每个值占总值的多少,化成度数
	float CurrentTotal = 0;
	for (int32 Index = 0; Index < InValues.Num(); Index++)
	{
		CurrentTotal += InValues[Index];
		int32 Angle = (int32)((CurrentTotal / Total) * 360);
		Angles.Add(Angle);
	}
}

void UPieWidget::SetColor(TArray<FLinearColor> InColors)
{
	Colors = InColors;
}

int32 UPieWidget::NativePaint(
	const FPaintArgs& Args,
	const FGeometry& AllottedGeometry,
	const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId,
	const FWidgetStyle& InWidgetStyle,
	bool bParentEnabled) const
{
	//绘制饼状图
	for (int32 Index = 0; Index < Angles.Num() - 1; Index++)
	{
		int32 BegingAngle = Angles[Index];
		int32 EndAngle = Angles[Index + 1];
		DrawFan(OutDrawElements, AllottedGeometry, LayerId, FVector2D(300.f, 300.f), 250.f, BegingAngle, EndAngle, GetColorByIndex(Index));
	}
	return LayerId++;
}

void UPieWidget::DrawFan(
	FSlateWindowElementList& OutDrawElements, 
	const FGeometry& AllottedGeometry, 
	int32 Layer, 
	const FVector2D& CenterPosition, 
	float Radius, 
	int32 BeginAngle, 
	int32 EndAngle, 
	FColor Color) const
{
	//绘制扇形
	if (EndAngle <= BeginAngle)//如果结束角度小于等于开始角度,不用绘制
		return;
	if (Radius <= 0.f)//半径很小也不绘制
		return;

	//定义顶点数组
	TArray<FSlateVertex> SlateVertexArray;

	//定义索引数组
	TArray<SlateIndex> SlateIndexArray;

	//画三角
	for (int32 CurrentAngle = BeginAngle; CurrentAngle < EndAngle; CurrentAngle++)
	{
		FSlateVertex CurrentSlateVertex;//当前顶点
		FSlateVertex NextSlateVertex;//下一个顶点
		FSlateVertex CenterSlateVertex;//中心点

		//将当前顶点的一维转换为二维
		FVector2D CurrentSlateVertextPositon = FVector2D(
			CenterPosition.X + Radius * FMath::Cos(FMath::DegreesToRadians(CurrentAngle)),
			CenterPosition.Y + Radius * FMath::Sin(FMath::DegreesToRadians(CurrentAngle))
			);
		//将下一个顶点的一维转换为二维
		FVector2D NextSlateVertextPositon = FVector2D(
			CenterPosition.X + Radius * FMath::Cos(FMath::DegreesToRadians(CurrentAngle + 1)),
			CenterPosition.Y + Radius * FMath::Sin(FMath::DegreesToRadians(CurrentAngle + 1))
		);
		//位置赋给三个顶点
		
		CurrentSlateVertex.Position = (FVector2f)AllottedGeometry.ToPaintGeometry().GetAccumulatedRenderTransform().TransformPoint(CurrentSlateVertextPositon);
		NextSlateVertex.Position = (FVector2f)AllottedGeometry.ToPaintGeometry().GetAccumulatedRenderTransform().TransformPoint(NextSlateVertextPositon);
		CenterSlateVertex.Position = (FVector2f)AllottedGeometry.ToPaintGeometry().GetAccumulatedRenderTransform().TransformPoint(CenterPosition);

		CurrentSlateVertex.Color = Color;
		NextSlateVertex.Color = Color;
		CenterSlateVertex.Color = Color;

		//把三个坐标放入到数组中
		int32 IndexOfCurrentSlateVertex = SlateVertexArray.Add(CurrentSlateVertex);
		int32 IndexOfNextSlateVertex = SlateVertexArray.Add(NextSlateVertex);
		int32 IndexOfCenterSlateVertex = SlateVertexArray.Add(CenterSlateVertex);

		//把索引值放入到索引数组中
		SlateIndexArray.Add(IndexOfCurrentSlateVertex);
		SlateIndexArray.Add(IndexOfCenterSlateVertex);
		SlateIndexArray.Add(IndexOfNextSlateVertex);
	}
	//顶点的UV
	for (FSlateVertex& TempSlateVertex : SlateVertexArray)
	{
		TempSlateVertex.TexCoords[0] = 0.0f;
		TempSlateVertex.TexCoords[1] = 0.0f;
		TempSlateVertex.TexCoords[2] = 0.0f;
		TempSlateVertex.TexCoords[3] = 0.0f;
	}
	//绘制
	const FSlateBrush* SlateBrush = FCoreStyle::Get().GetBrush("ColorSpectrum.Spectrum");
	FSlateResourceHandle SlateResourceHandle = FSlateApplication::Get().GetRenderer()->GetResourceHandle(*SlateBrush);

	FSlateDrawElement::MakeCustomVerts(
		OutDrawElements,
		Layer,
		SlateResourceHandle,
		SlateVertexArray,
		SlateIndexArray,
		nullptr, 0, 0
	);
}

FColor UPieWidget::GetColorByIndex(int32 InIndex) const
{
	if (Colors.Num() < 1)
		return FColor::White;
	return Colors[InIndex % Colors.Num()].ToFColor(true);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1714686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

博物馆三维实景vr展示

VR技术应用到地产行业的优势不言而喻&#xff0c;随着购房政策的进一步放宽&#xff0c;购房刚需者借助VR商铺样板间展示系统看房&#xff0c;远比之前跑楼盘更便捷高效。那么VR商铺全景展示具体有哪些好处呢? VR技术与商铺的结合&#xff0c;为客户带来了前所未有的购房体验。…

python基础知识总结(第一节)

一、python简介&#xff1a; Python是一种解释型&#xff0c;面向对象的高级语言。 Pyhton的语法和动态类型&#xff0c;以及解释性语言的本质&#xff0c;使它一跃成为多数平台上写脚本和快速开发应用的编程语言。 python语言百度百科介绍 二、Python基础语法&#xff1a;…

国产操作系统上apt命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上apt命令详解 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用apt命令的详解文章。apt&#xff08;Advanced Package Tool&#xff09;是Debian及其衍生发行版&#xff08;如统信UOS…

宁盾身份域管与天翼云电脑完成兼容互认证

近日&#xff0c;宁盾身份域管与天翼云电脑完成兼容互认证&#xff01;这是继中兴、深信服、升腾威讯云桌面/云电脑后&#xff0c;宁盾对接的第4个国产云桌面品牌。企业在引入国产云桌面时&#xff0c;同时会考虑微软AD目录的替代方案。宁盾国产化身份域管对接天翼云电脑从终端…

521源码-免费手游下载-【烽火中原H5】深度体验:横版网页国战手游及WIN学习手工端

【烽火中原H5】深度体验&#xff1a;横版网页国战手游及WIN学习手工端全面解析,烽火中原H5】横板网页国战手游WIN学习手工端语音视频教程营运后台CDK授权后台, 喜欢国战手游的玩家们&#xff0c;你们期待已久的【烽火中原H5】现已上线&#xff01;这款游戏以横版网页的形式呈现…

[LitCTF 2023]yafu (中级) (素数分解)

题目&#xff1a; from Crypto.Util.number import * from secret import flagm bytes_to_long(flag) n 1 for i in range(15):n *getPrime(32) e 65537 c pow(m,e,n) print(fn {n}) print(fc {c})n 152412082177688498871800101395902107678314310182046454156816957…

电商推荐系统+电影推荐系统【虚拟机镜像分享】

电商推荐系统电影推荐系统【虚拟机镜像分享】 所有组件部署好的镜像下载&#xff08;在下面&#xff09;&#xff0c;仅供参考学习。&#xff08;百度网盘&#xff0c;阿里云盘…&#xff09; 博主通过学习尚硅谷电商推荐电影推荐项目&#xff0c;将部署好的虚拟机打包成ovf文…

横截面分位数回归

一、分位数回归简介 分位数回归&#xff08;英语&#xff1a;Quantile regression&#xff09;是回归分析的方法之一。最早由Roger Koenker和Gilbert Bassett于1978年提出。一般地&#xff0c;传统的回归分析研究自变量与因变量的条件期望之间的关系&#xff0c;相应得到的回归…

[vue3后台管理二]首页和登录测试

[vue3后台管理二]首页和登录测试 1 修改main.js import ./assets/main.cssimport { createApp } from vue import App from ./App.vue import router from ./router createApp(App).use(router).mount(#app)2 路由创建 import {createRouter, createWebHistory} from vue-ro…

双指针+前缀和,蓝桥云课 近似gcd

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0近似gcd - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 考虑近似gcd的子数组的特点&#xff1a;不为g的倍数的数字个数小于等于1 我们用前缀和pre[]来存储不为g的倍数的数字个数 那么枚举左端点l&a…

计算机网络学习笔记——运输层(b站)

目录 一、 运输层概述 二、运输层端口号、复用与分用的概念 三、UDP和TCP的对比 四、TCP的流量控制 五、TCP的拥塞控制 六、TCP超时重传时间的选择 七、TCP可靠传输的实现 八、TCP报文段的首部格式 一、 运输层概述 物理层、数据链路层、网络层实现了主机到主机的通信…

Qt 基于FFmpeg的视频转换器 - 转GIF动图

Qt 基于FFmpeg的视频转换器 - 转GIF动图 引言一、设计思路二、核心源码三、参考链接 引言 gif格式的动图可以通过连续播放一系列图像或视频片段来展示动态效果&#xff0c;使信息更加生动形象&#xff0c;可以很方便的嵌入到网页或者ppt中。上图展示了视频的前几帧转为gif动图的…

大摩“凑热闹”:当前氧化铝紧平衡,任何供给冲击都将导致价格急剧波动

大摩认为&#xff0c;全球有590万吨氧化铝供应受阻&#xff0c;相等于扣除中国后全球供应约一成&#xff0c;而氧化铝需求可能有所上升&#xff0c;同时氧化铝库存缓冲有限&#xff0c;因此任何供给冲击都将导致价格急剧波动。 文章内容 今年以来氧化铝期货价格一路上行&#…

STM32-13-MPU

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 文章目录 STM32-12-MPU1. 内存保护单元MPU1. M…

JVM之性能优化

1.JVM优化什么 由博客JVM之垃圾回收-CSDN博客我们已经了解到了数据存储是在方法区和堆区&#xff0c;而堆区的使用更为频繁。堆区有什么呢?老年代、新生代、GC。因此JVM性能优化&#xff0c;优化什么&#xff1f; 我们猜想一下&#xff0c;新生代的大小设置&#xff1b;老年代…

模型实战(22)之 C++ - tensorRT部署yolov8-cls 目标分类

C++ - tensorRT部署yolov8-cls 目标分类 在检测应用场景中如果有同等类别不同形态的目标,单纯的目标检测可能达不到实用或者想要的精度,这就需要衔接一步分类python环境下如何直接调用推理模型转换并导出:pt -> onnx ->.engineC++ tensorrt 部署分类模型1.Python环境下…

【OrangePi AIpro】香橙派 AIpro 为AI而生

产品简介 OrangePi AIpro(8T)&#xff1a;定义边缘智能新纪元的全能开发板 在当今人工智能与物联网技术融合发展的浪潮中&#xff0c;OrangePi AIpro(8T)凭借其强大的硬件配置与全面的接口设计&#xff0c;正逐步成为开发者手中的创新利器。这款开发板不仅代表了香橙派与华为…

2024最新 Jenkins + Docker实战教程(七)- Jenkins实现远程传输和自动部署

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

powershell 配合aria2实现简单的图片爬取

powershell 配合aria2实现简单的图片爬取 01 前言 现如今&#xff0c;提到爬虫&#xff0c;令人不得不提到Python&#xff0c;确实简单&#xff0c;也强大&#xff0c;到处都可以找到教程。故而今天换换口味&#xff0c;用powershell来实现&#xff0c;配合aria2的强大下载功…

鸿蒙开发接口图形图像:【@ohos.window (窗口)】

窗口 窗口提供管理窗口的一些基础能力&#xff0c;包括对当前窗口的创建、销毁、各属性设置&#xff0c;以及对各窗口间的管理调度。 该模块提供以下窗口相关的常用功能&#xff1a; [Window]&#xff1a;当前窗口实例&#xff0c;窗口管理器管理的基本单元。[WindowStage]&…