UE5中绘制饼状图

饼状图

  • 使用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);}//顶点的UVfor (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.mzph.cn/diannao/19239.shtml

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

相关文章

服务器端请求伪造--SSRF

SSRF 简介 ##SSRF定义 SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由 攻击者构造形成&#xff0c;由服务端发起请求 的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从 外网无法访问的内部系统&#xff08;正是因为它是由服务端发起的&#xff0c;所…

一个小技巧轻松提升量化精度!IntactKV:保持关键词元无损的大语言模型量化方法

目录 摘要关键词元&#xff08;Pivot Tokens&#xff09;方法概述实验验证1. 权重量化2. KV Cache 量化3. 权重和激活值量化 参考文献 本文介绍我们针对大语言模型量化的工作 IntactKV&#xff0c;可以作为插件有效提升 GPTQ、AWQ、QuaRot 等现有主流量化方法效果。论文作者来自…

海外社媒账号如何运营安全稳定?

由于设备与网络原因&#xff0c;通常一个海外社媒账号尤其是多账号的稳定性都有一定限制&#xff0c;错误的操作或者网络都可能使得账号被封&#xff0c;前功尽弃。本文将为大家讲解如何通过IP代理来维持账号稳定与安全&#xff0c;助力海外社媒矩阵的搭建。 一、社媒账号关联…

深入理解计算机系统 家庭作业4.52

练习题4.3 p.254 \sim\seq\seq-full.hcl文件内已经说的很清楚了哪些不能更改,哪些是题目要求更改的控制逻辑块. 依据家庭作业4.51的答案,在seq-full.hcl文件内更改对应的HCL描述即可 以下答案注释了#changed的就是更改部分 #/* $begin seq-all-hcl */ ######################…

Redis 中 Set 数据结构详解

用法 Redis 中的 Set 是一个无序&#xff0c;不重复集合&#xff08;里面的元素为字符串&#xff09;&#xff0c;支持常用的集合操作。 常见命令 1. 增 添加一个或多个元素到 set 中 SADD key member [ member ... ] 返回值&#xff1a; 添加成功的元素个数 将一个元素移到…

数据结构(1):线性表

1 线性表的顺序实现 创建的新项目是cpp类型哦&#xff01; 1.1 初始化 1.1.1 静态分配 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #define MaxSize 10 //定义顺序表的长度 typedef struct {int data[MaxSize];//用静态的数组存放元素&#xff01;int lengt…

【UE5.1 角色练习】08-物体抬升、抛出技能 - part2

目录 前言 效果 步骤 一、让物体缓慢的飞向手掌 二、向着鼠标方向发射物体 前言 在上一篇&#xff08;【UE5.1 角色练习】08-物体抬升、抛出技能 - part1&#xff09;的基础上继续完成角色将物体吸向手掌&#xff0c;然后通过鼠标点击的方向来发射物体的功能。 效果 步骤…

【Linux 网络编程】网络的基础知识详解!

文章目录 1. 计算机网络背景2. 认识 "协议" 1. 计算机网络背景 网络互联: 多台计算机连接在一起, 完成数据共享; &#x1f34e;局域网&#xff08;LAN----Local Area Network&#xff09;: 计算机数量更多了, 通过交换机和路由器连接。 &#x1f34e; 广域网WAN: 将…

uniapp通过Canvas绘制网格(心电图,坐标纸等可用)

本篇文档是Canvas绘制心电图的第一个部分&#xff0c;想了解详情的可以关注后学习交流。 心电图的最底层需要一个网状底层&#xff0c;来方便进行数据的测量。 一、白底分大、中、小三个区域的网格 1、首先是HTML部分 <!DOCTYPE html> <html lang"en">…

【贪心算法】C++解决回文串、增减字符串匹配、分发饼干、跳跃游戏、加油站问题

1. 前言 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优决策的算法。贪心算法通常用来解决最优化问题&#xff0c;其核心思想是通过局部最优解逐步推导出全局最优解。 在贪心算法中&#xff0c;我们并不总是考虑到未来可能发生的…

代理注册湖北武汉投资管理公司流程和条件

我公司代理注册湖北武汉投资管理公司&#xff0c;现在大家都知道全国的投资管理公司已经停批了&#xff0c;很多需要收购的老板都是通过收购现成的投资管理公司经营的&#xff0c;现在我告诉大家一个好消息&#xff0c;我们有渠道办理湖北武汉资产管理公司&#xff0c;详情致电…

521源码-免费源码下载-免费学习网站教程-宝塔面板ssl网站证书到期后弹出无法续期错误提示

宝塔面板如果从老版本升级到8.10后&#xff0c;当点站证书过期续期时会弹出错误&#xff1a; 排查文件是找不到问题出在哪里&#xff0c;导致续期错误。 解决办法&#xff1a;通过摸索&#xff0c;最简单的就是删除站点&#xff0c;注意&#xff1a;只是删除&#xff0c;不是把…

亚马逊VC账号产品热销,在美国哪些智能小家电产品最好卖?

亚马逊VC账号产品在美国市场的热销&#xff0c;反映了消费者对于特定智能小家电产品的强烈需求。智能小家电产品因其实用性、便捷性和科技感&#xff0c;近年来在美国市场备受追捧。 以下是一些在亚马逊VC账号上热销的智能小家电产品&#xff1a; 智能扫地机器人 这类产品在美…

[vue3后台管理一]vue3下载安装及环境配置教程

[vue3后台管理二]vue3下载安装element plus 一、vue3下载安装element plus cnpm install element plus二&#xff1a;修改main.js import { createApp } from "vue"; import App from "./App.vue"; import ElementPlus from "element-plus"; …

JAVA:Random详解

Java中的java.util.Random类用于生成伪随机数。它提供了多种方法来生成不同类型的随机数&#xff0c;包括整数、浮点数和布尔值。以下是对Random类及其主要方法的详细介绍 一、生成随机数 创建一个Random对象&#xff0c;可以使用以下两种方式&#xff1a; 无参构造函数&…

建议大家少用点儿网站测速工具

春节休息期间明月有接了几个服务器代运维的业务&#xff0c;期间就发现不少新手站长们还在用 17ce、站长工具等等这些网站测速工具来评判站点访问速度的&#xff0c;感觉很有必要给大家聊聊这个事儿&#xff0c;因为这毕竟也是一个涉及服务器安全的一个重要环节了。 其实&#…

那些不起眼但很好玩的API合辑

那些不起眼但很好玩的API&#xff0c;为我们带来了许多出人意料的乐趣和惊喜。这些API可能看起来并不起眼&#xff0c;但它们却蕴含着无限的创意和趣味性。它们可以是一些小游戏API&#xff0c;让我们可以在闲暇时刻尽情娱乐&#xff1b;也可以是一些奇特的音乐API&#xff0c;…

【后端开发】服务开发场景之分布式(CAP,Raft,Gossip | API网关,分布式ID与锁 | RPC,Dubbo,Zookeeper)

【后端开发】服务开发场景之分布式&#xff08;CAP&#xff0c;Raft&#xff0c;Gossip | API网关&#xff0c;分布式ID与锁 | RPC&#xff0c;Dubbo&#xff0c;Zookeeper&#xff09; 文章目录 1、如何设计一个分布式系统&#xff1f;&#xff08;底层原理&#xff09;理论&a…

怎样清理Mac存储空间 苹果电脑内存不够用怎么办 苹果电脑内存满了怎么清理

在使用 Mac 电脑的过程中&#xff0c;用户经常会遇到磁盘空间不足的困扰&#xff0c;这时候就需要寻找有效的方法来清理苹果电脑内存了。 清理Mac存储空间可以通过多种方法进行&#xff0c;以确保你的Mac能够高效运行并释放宝贵的存储空间。以下是一些有效的清理和优化方法&am…

数据结构和算法|排序算法系列(一)|选择排序

首先需要你对排序算法的评价维度和一个理想排序算法应该是什么样的有一个基本的认知&#xff1a; 《Hello算法之排序算法》 主要内容来自&#xff1a;Hello算法11.2 选择排序 选择排序是明显的基于比较的排序。下文开始阐述选择排序的整个算法流程 算法流程 选择排序应该已…