资料
  • 资料
  • 专题
OpenGL-自主高性能三维GIS平台架构与实现(第2季)
推荐星级:
类别: 模拟/数字
时间:2024-01-02
大小:2.95KB
阅读数:117
上传用户:开心就很好了
查看他发布的资源
下载次数
1
所需E币
0
ebi
新用户注册即送 300 E币
更多E币赚取方法,请查看
close
资料介绍
今天给大家讲讲关于OpenGL的知识,以及结合OpenGL自主高性能三维GIS平台架构与实现的全流程。我将从2D->2.5D->3D立体球,全程零代码到完全实现,带着大家一步步学习。

首先,我们先来看看什么是OpenGL?
OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。

如果用一句话来描述 OpenGL 的话,我想应该是基于C/S结构设计的模板模式(设计模式里的那个);在 图形渲染管线 这节,主要介绍的是其模板设计,在 OpenGL 里我们称之为 PipeLine;在 C/S结构 这节,则介绍 OpenGL C/S 结构给 OpenGL 带来的一些对于初学者看起来可能觉得奇奇怪怪的东西。

我们知道,automapper的映射是基于语法糖和语法约定的,他会自动映射两个对象中名字相同的字断,而默认情况下,找不到匹配的字断将会被忽略,使用null,使用空来代替。除了使用automapper的自动映射,我们也可以手动添加映射关系。比如,dto中的价格,相当于模型中原价乘以折扣,我们可以把这个计算过程放在automapper中进行,对这样的映射过程有一个专有名词,叫做投影,projection。投影是个数学概念,所谓投影,就是把资源对象中的某一个或几个数据,进过一定的变化和计算,然后传递给目标对象。在autompeer中,我们可以使用ForMember函数做字断的投影。
public TouristRouteProfile()
{
CreateMap<TouristRoute, TouristRouteDto>()
.ForMember(
dest => dest.Price,
opt => opt.MapFrom(src => src.OriginalPrice * (decimal)(src.DiscountPresent ?? 1))
)
.ForMember(
dest => dest.TravelDays,
opt => opt.MapFrom(src => src.TravelDays.ToString())
)
.ForMember(
dest => dest.TripType,
opt => opt.MapFrom(src => src.TripType.ToString())
)
.ForMember(
dest => dest.DepartureCity,
opt => opt.MapFrom(src => src.DepartureCity.ToString())
);
}
这次ValidationContext 所访问的不再是属性级别的数据,而是class类级别的数据,然后再通过class来访问属性。所以如果我们想访问TouristRouteForCreationDto的话,代码可以这么写,本地变量 var touristRoute 等于 validationContext 点 ObjectInstance,因为这个时候获取的数据类型是普通的对象,所以我们还需要进行类型转换,(),把它转化为“(TouristRouteForCreationDto)”,当然,我们还需要引入dto的命名空间。
public class TouristRouteTitleMustBeDifferentFromDescriptionAttribute: ValidationAttribute
{
    protected override ValidationResult IsValid(
        object value, 
        ValidationContext validationContext
    )
    {
        var touristRouteDto = (TouristRouteForCreationDto)validationContext.ObjectInstance;
        if (touristRouteDto.Title == touristRouteDto.Description)
        {
            return new ValidationResult(
                "路线名称必须与路线描述不同",
                new[] { "TouristRouteForCreationDto" }
            );
        }
        return ValidationResult.Success;
    }
}
拿到用户数据,我们就可以开始配置jwt数据了,首先,在claims数组中,把假数据替换为真数据。 接着,继续使用userManager 来获得用户的角色的字符串。
// 3. 添加用户
var adminUserId = "90184155-dee0-40c9-bb1e-b5ed07afc04e";
ApplicationUser adminUser = new ApplicationUser
{
    Id = adminUserId,
    UserName = "admin@fakexiecheng.com",
    NormalizedUserName = "admin@fakexiecheng.com".ToUpper(),
    Email = "admin@fakexiecheng.com",
    NormalizedEmail = "admin@fakexiecheng.com".ToUpper(),
    TwoFactorEnabled = false,
    EmailConfirmed = true,
    PhoneNumber = "123456789",
    PhoneNumberConfirmed = false
};
那这种 C/S 结构对于我们使用 OpenGL 有什么影响呢? 最大的影响就是在于我们只能在 OpenGL context 所在的线程调用 OpenGL 的接口,详细阅读 EGL 标准你会知道所有 OpenGL 接口都存在一个阴式的入参,就是 OpenGL Context
public static async Task<PaginationList<T>> CreateAsync(
    int currentPage, int pageSize, IQueryable<T> result)
{
    // pagination
    // skip
    var skip = (currentPage - 1) * pageSize;
    result = result.Skip(skip);
    // 以pagesize为标准显示一定量的数据
    result = result.Take(pageSize);

    // include vs join
    var items = await result.ToListAsync();

    return new PaginationList<T>(currentPage, pageSize, items);
}
最后,在返回数据的时候,删掉分页处理的部分,返回类型使用PaginationList的实例创建工厂。
private readonly AppDbContext _context;
private readonly IPropertyMappingService _propertyMappingService;

public TouristRouteRepository(
    AppDbContext appDbContext,
    IPropertyMappingService propertyMappingService
)
{
    _context = appDbContext;
    _propertyMappingService = propertyMappingService;
}
本文到此结束,感谢大家的观看!!
版权说明:本资料由用户提供并上传,仅用于学习交流;若内容存在侵权,请进行举报,或 联系我们 删除。
PARTNER CONTENT
相关评论 (下载后评价送E币 我要评论)
没有更多评论了
  • 可能感兴趣
  • 关注本资料的网友还下载了
  • 技术白皮书