BuildaFlightTrackerwithCesiumforUnreal_译

这个教程会使用真实世界飞机数据控制一个飞机飞过从圣弗朗西斯科到哥本哈根。
你会学到怎样:
1)输入真实数据到UnrealEngine
2)使用数据和USplineComponent
3)输入一个飞机模型和有让飞机跟随飞行航线
4)在飞机上转换不同的相机视角

预备:
1)一个安装好的UneralEngine版本(至少4.26或者以上)。怎样安装UnrealEngine的提示,看Unreal Engine download page,详细的提示参考Installing Unreal Engine guide。
2)用C++的VisualStudio2019桌面开发
3)知道怎么设置以恶基础的CesiumforUnreal应用程序。看CesiumforUnrealQuickstartguide提示怎么开始CesiumforUnreal插件。

步骤1:创建一个Unreal关卡
你可能或者用UnrealEngine市场从 Cesium for Unreal Samples01_CesiumWorld关卡开始或者创建一个新的关卡。如果开始一个新的关卡,确保至少用CesiumWorldTerrain和一些光照,或者用CesiumSunSky或用你自己的光照构成关卡。看 Quickstart guide学习怎么用CesiumforUnreal设置一个新的关卡。
对于这个教程,CesiumGeoreference设置飞机起点在圣弗朗西斯科国际机场。
Origin Latitude = 37.61779
Origin Longitude = -122.390533
Origin Height = 0.0

步骤2:添加PlaneTrack类
PlaneTrack类会包含拥有飞行数据和为代表航线的样条线生成位置点的逻辑。
1)在UnrealEditor左上角File -> New C++Class添加一个新的C++类。选择Actor作为父类。点击Next按钮。在接下来的页面设置新类名字为“PlaneTrack”。点击绿色的CreateClass按钮。
VisualStudio自动打开文件。如果没有,在File -> OpenVisualStudio用VisualStudio打开工程。

新的C++文件在VisualStudio项目的源文件下。

2)在项目的Source文件夹下的.Build.cs文件中添加以下代码段

// Add Cesium for Unreal plugin dependency path
PrivateDependencyModuleNames.AddRange(new string[] { "CesiumRuntime" });// Tell Unreal Engine to use C++17
CppStandard = CppStandardVersion.Cpp17;


3)我们开始给PlaneTrack添加一些成员变量存储飞行数据,样条线,和转换数据到合适的坐标系统。输入必要的库,并给PlaneTrack添加一下公开变量:

...
// Add import paths. Make sure they go above the PlaneTrack.generated.h line
#include "Components/SplineComponent.h"
#include "CesiumGeoreference.h"
#include "Engine/DataTable.h"
...public: // Spline variable to represent the plane trackUPROPERTY(BlueprintReadOnly, Category = "FlightTracker")USplineComponent* SplineTrack;// Cesium class that contain many useful  coordinate conversion functionsUPROPERTY(EditAnywhere, Category = "FlightTracker")ACesiumGeoreference* CesiumGeoreference;// An Unreal Engine data table to store the raw flight dataUPROPERTY(EditAnywhere, Category = "FlightTracker")UDataTable* AircraftsRawDataTable;

4)导航到PlaneTrack.cpp并在PlaneTrack构造中初始化SplineTrack变量,如下:

APlaneTrack::APlaneTrack()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;// Initialize the trackSplineTrack = CreateDefaultSubobject<USplineComponent>(TEXT("SplineTrack"));// This lets us visualize the spline in Play modeSplineTrack->SetDrawDebug(true);                                            // Set the color of the splineSplineTrack->SetUnselectedSplineSegmentColor(FLinearColor(1.f, 0.f, 0.f));
}

ACesiumGeoference和UDataTable变量在UnrealEngine编辑器中设置。
下一步之前,保存并编译代码。在UnrealEngineEditor顶端工具面板点击Compile:

如果代码格式好且正确,你会在UnrealEngine主编辑器底端右角看到“CompileComplete”消息。这个教程,编译代码参考这步。

步骤3:引入真实世界飞行数据
接下来,你会使用真实的从圣弗朗西斯科到哥本哈根的飞行数据。这个数据由FlightRadar24收集。CesiumforUnreal中的高度参考WHS84椭球以米记。这个数据预处理从相对平均海平面的英尺转换为相对椭球的米。
你可以下载转换数据here。

为PlaneTrack可以完成坐标转换,你要在项目中使用UnrealEngine的DataTable存储数据。这一步,你要创建一个代表航线数据的数据结构。
1)在PlaneTrack.h中直接插入以下代码段定义航线数据结构:

USTRUCT(BlueprintType)
struct FAircraftRawData : public FTableRowBase
{GENERATED_USTRUCT_BODY()public:FAircraftRawData(): Longitude(0.0), Latitude(0.0), Height(0.0){}UPROPERTY(EditAnywhere, Category = "FlightTracker")double Longitude;UPROPERTY(EditAnywhere, Category = "FlightTracker")double Latitude;UPROPERTY(EditAnywhere, Category = "FlightTracker")double Height;
};

这个结构包含三个成员变量:Longitute,Latitute,Height。这些变量在原数据表中和行名一致。注意结构从FTableBase中继承。
编译代码。
2)拖拉.csv数据文件UnrealEngine的ContentBrowser。
在ChooseDataTableRowType下拉中选择AircraftRawData:

点击Apply并且在ContentBrowser中新的UDataTable对象双击打开数据表:

!)问题解决:如果你收到一个错误说UnrealEngine不能输入,检查看是否数据保存在项目文件夹。如果数据存在其他位置错误经常发生。

步骤4:给飞行追踪添加位置
这一步,你会给PlaneTrack类添加更多的代码去完成创建样条路径的剩下的功能需要。
1)给PlaneTrack.h在 PlaneTrack.Generated.h行上添加以下输入:

// Imports should be placed above the PlaneTrack.Generated.h line.
...
#include <glm/vec3.hpp>
#include "CesiumGeospatial/Ellipsoid.h"
#include "CesiumGeospatial/Cartographic.h"

仍在PlaneTrack.h在AplaneTrack类定义后添加以下功能:


public:// Function to parse the data table and create the spline trackUFUNCTION(BlueprintCallable, Category = "FlightTracker")void LoadSplineTrackPoints();

2)转到PlaneTrack.cpp添加以下代码段去创建LoadSplineTrackPoints。大部分计算会在这儿完成。

void APlaneTrack::LoadSplineTrackPoints(){if (this->AircraftsRawDataTable != nullptr && this->CesiumGeoreference != nullptr){int32 PointIndex = 0;for (auto& row : this->AircraftsRawDataTable->GetRowMap()){FAircraftRawData* Point = (FAircraftRawData*)row.Value;// Get row data point in lat/long/alt and transform it into UE4 pointsdouble PointLatitude = Point->Latitude;double PointLongitude = Point->Longitude;double PointHeight = Point->Height;// Compute the position in UE coordinatesglm::dvec3 UECoords = this->CesiumGeoreference->TransformLongitudeLatitudeHeightToUe(glm::dvec3(PointLongitude, PointLatitude, PointHeight));FVector SplinePointPosition = FVector(UECoords.x, UECoords.y, UECoords.z);this->SplineTrack->AddSplinePointAtIndex(SplinePointPosition, PointIndex, ESplineCoordinateSpace::World, false);// Get the up vector at the position to orient the aircraftconst CesiumGeospatial::Ellipsoid& Ellipsoid = CesiumGeospatial::Ellipsoid::WGS84;glm::dvec3 upVector = Ellipsoid.geodeticSurfaceNormal(CesiumGeospatial::Cartographic(FMath::DegreesToRadians(PointLongitude), FMath::DegreesToRadians(PointLatitude), FMath::DegreesToRadians(PointHeight)));// Compute the up vector at each point to correctly orient the planeglm::dvec4 ecefUp(upVector, 0.0);const glm::dmat4& ecefToUnreal = this->CesiumGeoreference->GetEllipsoidCenteredToUnrealWorldTransform();glm::dvec4 unrealUp = ecefToUnreal * ecefUp;this->SplineTrack->SetUpVectorAtSplinePoint(PointIndex, FVector(unrealUp.x, unrealUp.y, unrealUp.z), ESplineCoordinateSpace::World, false);PointIndex++;}this->SplineTrack->UpdateSpline();}}

保存编译代码。
3)导航到UnrealEngine添加飞行追踪到场景。在PlaceActors面板,搜索“PlaneTrack”并拖拉进视口。
4)选择PlaneTrack。在Detail面板找到FlightTracker目录。设置CesiumGeoference变量为你场景中的CesiumGeoference并色湖之AircraftsRawDataTable为步骤3添加的数据表。

5)导航到LevelBlueprint。你将添加蓝图节点去完成样条路径。

6)找到EventBeginPlay节点。这个节点子Play模式下最开始的时候调用。从WorldOutliner中拖拉PlaneTrack,从这个节点拉出一个连接,搜索添加ClearSplinePoints功能节点。
样条线第一次添加到场景时,默认有两个点。这两个点是任意的,在本教程中不需要,所以它们可以用Clear Spline points来清除。
7)从PlaneTrack对象节点拉出另一个连接并搜索“LoadSplineTrackPoints”。连接ClearSplinePoints和LoadSplineTrackPoints节点。并且连接EventBeginPlay节点到ClearSplinePoints。这最终蓝图网看起来像这样:

在BlueprintEditor左上角点击Compile。因为样条可见默认是关闭的,你可以选择视口,在你的键盘桑按下`键(通常在Esc键下方)并输入 ShowFlag.Splines 1 命令让它打开。检查是否所有都设置正确,在主编辑点击Play按钮。你应该可以看到数据点由在圣弗朗西斯科国际机场的终端建筑开始的样条曲线连接。

步骤5:添加飞行器
完成飞行器追踪的最后一步是添加一个跟随样条路径的飞行器。飞行器格网模型,你可以用你喜欢的任何模型。Here是一个来自TurboSquid的波音787的飞行器模型,你可以免费下载。
这个教程中的飞行器模型是来自 Sketchfab波音737飞行器模型。
1)在ContentBrowser,通过选择Add/Import -> ImporttoGame/[Path]输入飞行器模型到内容浏览器。你可以在StaticMeshEditor看模型。

2)在ContentBrowser空白区域右键点击并选择BlueprintClass。当推出选择父类时,选择Actor。命名为“BP_Aircraft”(BP代表蓝图)。这个类会包含沿着样条路径移动飞行器的逻辑。
3)在新的蓝图类上双击进入BlueprintEditor。在左上角点击绿色的AddComponent按钮并搜索“StaticMesh”。添加带组件列表并命名为“AircraftMesh”。

4)选择这个组件。定位Detail面板在BlueprintEditor的右边。找到StaticMesh表变量并在下拉中找到并选择你之前输入的飞行器。
5)在BlueprintEditor顶部通过点击EventGraph转到EventGraph。在任何地方右击并搜索“CustomEvent”。命名这个事件为“MoveAircraft”。
6)再在EventGraph右击并搜索“AddTimeline”。这个时间线节点会作为整个飞行器移动时间的时间线。

7)双击时间线节点打开TimelineEditor。通过在编辑器左上角点击AddFloatTrack创建一个单精度的曲线并给出一个名字。这个教程中,FloatTrack叫做“Alpha”。在曲线上右击选择AddKeytoCurve给时间线添加关键帧。最后曲线看起来像这样:

第一个关键点在Time=0,Value=0,第二个关键点在Time=1,Value=1.为给关键点安排更精确的值,选择并在左上角键入值:
选中UseLastKeyframe选择框。如果你想飞行器结束之后循环,你可以选中Loop选择框。
返回EventGraph并通过右键选择Promotetovariable提升Timeline输出引脚的Alpha到变量。这样将添加一个新的变量到左边Components下的面板。

8)在 My Blueprint面板使用绿色的AddNew给BP_Aircraft添加一个叫Duration的变量。这个变量决定了飞行器沿着路径飞行花费多长时间。给它一个float类型并点击就眼睛图标使它在主UnrealEngine编辑器公开并可编辑。
相似地,给飞机蓝图添加其他变量:
AircraftStartOffset:float类型;公开可见;用于据欸的那个飞行器在时间线上开始的位置。SliderRange和ValueRange应该在0到1之间,因为时间线在0 到1之间。这些变量可以在BlueprintEditor的Detail面板编辑。
PlaneTrack:用ObjectReference的PlaneTrack类型;公开可见;用于存储一个PlaneTrack对象的引用以检索样条上的位置。

最后组件看起来像这样:

9)如下完成剩下的MoveAircraft事件:

使用变量,可以拖拉变量到EventGraph或者在图表任意位置右击并搜索变量名。调用和变量一致的功能可以从变量节点拉出一个新的连接并搜索函数名。
编译蓝图。
10)接下来,你会添加一个连接PlaneTrack样条线到MoveAircraft函数并且使用样条线插入飞行器位置。在同一个EventGraph中,在MoveAircraft下创建以下节点网:

11)最后,连接两个蓝图网,一起用setActorTransform节点:

编译蓝图。
12)导航到主编辑器。从ContentBrowser中拖拉BP_Aircraft蓝图到场景或者在PlaceActor中搜索Aitcraft把你的飞行器对象添加到场景。
13)这儿由好几种方式去触发MoveAircraft事件。在这个教程中,你会用一个键触发。返回LevelBlueprint。在EventGraph,添加一个键盘节点(这儿用M)。连接这个键盘节点到MoveAircraft事件如下:

编译蓝图。

14)选择BP_Aircraft,返回Detail面板并且初始化Duration,PlaneTrack,AirplaneOffset变量。需要注意的是,Duration值越高,飞机在这条路径上飞行的时间就越长。对于Duration,100000的值会很好的运行。修改AirplaneOffset变量以在路径上的另一个点开始飞行。例如,由于0.0是飞行的开始,1.0是飞行的结束,因此将AirplaneOffset设置为0.9以开始接近飞行的结束。

当视口聚焦在飞机上时,单击Play按钮并按下M(或你选择连接Move aircraft事件的键)来开始飞行。

切换不同的相机视图(可选)
你将实现一些摄像机切换,从不同的角度观察飞行。这一步是可选的,但它可以为您的项目添加一个很好的效果。
1)使用PlaneActor面板添加两个新的CaneraActors到场景。在右边的Detail面板拖拉Camera Actors给BP_Aircraft,使得他们是BP_Aircraft的孩子:

当飞行器移动时,相机也随着移动。调整相机让看起来一个在顶部往下看,另一个在侧边看:


2)一旦相机放好,导航到LevelBlueprint。为侧边和顶部相机视图添加键盘事件:

编译蓝图并返回主编辑器看结果。在Play模式下,你可以在LevelBlueprint按下指定键测试新的相机转换要素。

完整源码
PlaneTrack.h

// Copyright 2020-2021 CesiumGS, Inc. and Contributors#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/SplineComponent.h"
#include "CesiumGeoreference.h"
#include "Engine/DataTable.h"
#include <glm/vec3.hpp>
#include "CesiumGeospatial/Ellipsoid.h"
#include "CesiumGeospatial/Cartographic.h"
#include "PlaneTrack.generated.h"USTRUCT(BlueprintType)
struct FAircraftRawData : public FTableRowBase
{GENERATED_USTRUCT_BODY()public:FAircraftRawData(): Longitude(0.0), Latitude(0.0), Height(0.0){}UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FlightTracker")float Longitude;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FlightTracker")float Latitude;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FlightTracker")float Height;
};UCLASS()
class CESIUMUNREAL_API APlaneTrack : public AActor
{GENERATED_BODY()public:  // Sets default values for this actor's propertiesAPlaneTrack();// Spline variable to represent the plane trackUPROPERTY(BlueprintReadOnly, Category = "FlightTracker")USplineComponent* SplineTrack;// A pawn from the Cesium for Unreal API that can convert between different coordinatesUPROPERTY(EditAnywhere, Category = "FlightTracker")ACesiumGeoreference* CesiumGeoreference;// An Unreal Engine data table to store our raw flight dataUPROPERTY(EditAnywhere, Category = "FlightTracker")UDataTable* AircraftsRawDataTable;protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:  // Called every framevirtual void Tick(float DeltaTime) override;// Function to parse the data table and create the spline trackUFUNCTION(BlueprintCallable, Category = "FlightTracker")void LoadSplineTrackPoints();
};

PlaneTrack.cpp

// Copyright 2020-2021 CesiumGS, Inc. and Contributors#include "PlaneTrack.h"// Sets default values
APlaneTrack::APlaneTrack()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;// Initialize the trackSplineTrack = CreateDefaultSubobject<USplineComponent>(TEXT("SplineTrack"));// This lets us visualize the spline in Play modeSplineTrack->SetDrawDebug(true);// Set the color of the splineSplineTrack->SetUnselectedSplineSegmentColor(FLinearColor(1.f, 0.f, 0.f));
}// Called when the game starts or when spawned
void APlaneTrack::BeginPlay()
{Super::BeginPlay();
}// Called every frame
void APlaneTrack::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}void APlaneTrack::LoadSplineTrackPoints()
{if (this->AircraftsRawDataTable != nullptr && this->CesiumGeoreference != nullptr){int32 PointIndex = 0;for (auto& row : this->AircraftsRawDataTable->GetRowMap()){FAircraftRawData* Point = (FAircraftRawData*)row.Value;// Get row data point in lat/long/alt and transform it into UE4 pointsfloat PointLatitude = Point->Latitude;float PointLongitude = Point->Longitude;float PointHeight = Point->Height;// Compute the position in UE coordinatesglm::dvec3 UECoords = this->CesiumGeoreference->TransformLongitudeLatitudeHeightToUe(glm::dvec3(PointLongitude, PointLatitude, PointHeight));FVector SplinePointPosition = FVector(UECoords.x, UECoords.y, UECoords.z);this->SplineTrack->AddSplinePointAtIndex(SplinePointPosition, PointIndex, ESplineCoordinateSpace::World, false);// Get the up vector at the position to orient the aircraftconst CesiumGeospatial::Ellipsoid& Ellipsoid = CesiumGeospatial::Ellipsoid::WGS84;glm::dvec3 upVector = Ellipsoid.geodeticSurfaceNormal(CesiumGeospatial::Cartographic(FMath::DegreesToRadians(PointLongitude), FMath::DegreesToRadians(PointLatitude), FMath::DegreesToRadians(PointHeight)));// Compute the up vector at each point to correctly orient the planeglm::dvec4 ecefUp(upVector,0.0);const glm::dmat4& ecefToUnreal = this->CesiumGeoreference->GetEllipsoidCenteredToUnrealWorldTransform();glm::dvec4 unrealUp = ecefToUnreal * ecefUp;this->SplineTrack->SetUpVectorAtSplinePoint(PointIndex, FVector(unrealUp.x, unrealUp.y, unrealUp.z), ESplineCoordinateSpace::World, false);PointIndex++;}this->SplineTrack->UpdateSpline();}
}

下步:
目前,飞机的速度在整个飞行路径中是恒定的。如果数据集具有速度或速度变量,则可以使用它根据飞机在样条轨迹上的位置来调整飞机的速度。类似地,你可以用真实数据调整飞机的航向、偏航、俯仰。
现在你已经完成了这个CesiumforUnreal教程,请到Community Forum去分享关于CesiumforUnreal和这个教程你的反馈,或者在Twitter上的标签 @CesiumJS,向世界展示你的成就。

ps:
原文地址:https://cesium.com/learn/unreal/unreal-flight-tracker/

BuildaFlightTrackerwithCesiumforUnreal_译相关推荐

  1. java程序a-z b-y_有一行电文,以按下面规律译成密码: A---Z a---z B---Y b---Y C---X c---x …… 即第1个字母编程第26个字...

    有一行电文,以按下面规律译成密码: A--->Z a--->z B--->Y b--->Y C--->X c--->x -- 即第1个字母编程第26个字母,第i个字 ...

  2. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)

    使用 HttpApplication 对象 ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性.这种交叠有一个很好的例子就是 HttpAppl ...

  3. 【译】Monolith first —— Martin Fowler 对于微服务架构的看法

    转载文章,文章经 LiteCodes 授权,转载至本博客. 原文地址:[译]Monolith first -- Martin Fowler 对于微服务架构的看法 整体架构先行(Monolith fir ...

  4. TWAIN Specification Chapter 4 “Advanced Application Implementation”译——应用程序端的高级实现...

    本文是对TWAIN规范的第四章<应用程序端的高级实现>的翻译.因工作需要了解TWAIN,所以顺便译了一下.这是私人工作,您可以参考,但本人不保证不存在翻译的差错或不合宜.如果您发现有不妥的 ...

  5. (C++)第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。

    题目描述 有一行电文,已按如下规律译成密码: A–>Z a–>z B–>Y b–>y C–>X c–>x - - 即第一个字母变成第26个字母,第i个字母变成第(2 ...

  6. Express4.x API (四):Router (译)

    Express4.x API 译文 系列文章 Express4.x API (一):application (译) -- 完成 Express4.x API (二):request (译) -- 完成 ...

  7. 全球首个突破200种语言互译的翻译引擎,百度翻译打破世界沟通壁垒

    机器翻译作为人工智能关键技术之一,正日益成为企业智能化升级的重要应用场景.12月1日,百度大脑开放日举办了以"机器翻译 沟通全世界"为主题的专场活动. IDC 中国副总裁兼首席分析 ...

  8. 用AI实现C++、Java、Python代码互译,运行成功率最高达80.9%

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 还记得美国前一阵要招聘60岁的老程序员吗?都怪编程语言发展太快! 因为新冠疫情的缘故,美国一些地区的失业救济系统不堪重负,而这些系统都是上 ...

  9. [译]从零开始成为数据科学家的9个步骤

    [译]从零开始成为数据科学家的9个步骤 原文链接:http://www.datasciencecentral.com/profiles/blogs/9-steps-to-become-a-data-s ...

  10. Jabba: hybrid error correction for long sequencing reads using maximal exact matches机译:Jabba:使用最大精

    Jabba: hybrid error correction for long sequencing reads using maximal exact matches 机译:Jabba:使用最大精确 ...

最新文章

  1. getDay()显示的是本周的第几天
  2. java script 遍历数组_JavaScript中数组中遍历的方法
  3. DB2存储过程语法规则
  4. 深度学习和目标检测系列教程 3-300:了解常见的目标检测的开源数据集
  5. UVa 264 - Count on Cantor
  6. JavaScript覆盖率统计实现
  7. 谷歌官宣安卓改名!甜点不再
  8. admin客户管理系统html5模板
  9. 2019ASC世界大学生超算竞赛预赛结果出炉:20校晋级,北航第一
  10. jdbc中mySQL语句单双引号_JDBC: 执行MySQL语句时,bit类型的数值在java代码中应该怎么表示?...
  11. 模拟便于直接存取的索引文件结构_07016.2.0使用Solr7对结构化csv文件建立全文索引...
  12. python骗局-我终于在生活中用到Python了!!!——用爬虫来揭露骗局真相
  13. java解压zip文件程序_java 解压zip文件
  14. 存储过程判断查询结果是否为空_vlookup查询为什么会出现#N/A?原来知道这6种解决方法这么重要...
  15. 汽车标志大全 买车必知
  16. 拓扑排序以及拓扑排序算法
  17. Mac卸载Anaconda
  18. R语言 交互式绘图echarts4r包Pictorial深探
  19. cz73 读取速度慢_CPU 访问硬盘速度很慢的原因找到了
  20. web网页设计实例作业 HTML5+CSS大作业——简单的个人图片网站(6页)

热门文章

  1. editor 插入图片之后将光标放到右侧_如何排版只有一张图片的PPT?返稿20遍,我才做出领导满意的20个版式!...
  2. glusterfs 挂载卷 Transport endpoint is not connected
  3. ftpput到远程服务器目录
  4. 2023世界杯新媒体传播热点盘点 中国元素之中国馆、富而喜悦!
  5. 计算机网络技术摘要,计算机网络设计摘要.doc
  6. 52.【Java 数据结构——线性表】
  7. 【搜索】训练题C - Computer Game
  8. 数据结构 - 数组的存储表示和实现
  9. 快速学好一门编程语言
  10. CSU1232 懒汉的旅行 bfs+优先队列