vtk用户指南 第十一章 随时间变化的数据

2023-12-19

11.1时序支持简介

创建可视化工具包的目的是允许人们可视化,从而探索具有空间范围的数据中的特征。它允许人们回答一些问题,比如“在这些数据中,最大价值的区域在哪里?”“它们有什么形状和价值?”以及“这些形状是如何分布的?”VTK提供了大量的技术来显示和分析数据,因为它存在于一个单一的时刻。探索具有时间范围的数据也很重要。一个人也想回答这样的问题。“随着时间的推移,这些形状是如何增长、移动和缩小的?”

由于VTK代表一个只有X、Y和Z坐标值的点,这个目标变得复杂了。添加T是不切实际的,因为向后兼容性需求和在T不重要的最常见情况下需要节省RAM。在可视化工具包的早期版本中,人们实现了各种解决方法来克服对时间支持的基本不足。例如,有时会加载多个属性数组集(每个时间步一个集合),并告诉过滤器遍历这些集合。

创建这样的变通方法是困难的,不仅因为缺乏对VTK的支持,而且还因为存储时变数据的格式多种多样。一些从业者将整个数据集存储在一个顺序命名的文件中,用于每个时间点(定期或不定期采样)。另一些则将随时间变化的数据部分存储在一个或多个单独的文件中。有些像上面建议的那样将T坐标与X、Y和Z坐标一起存储,有些则以高度压缩的编码格式存储数据。

随着计算能力的增长和普及,对时变科学数据的探索和分析已经变得司空见惯。自5.2版以来,VTK包含了一个用于时变可视化的通用基础设施。该基础结构不浪费内存,并且向后兼容。在通常情况下,当时间无关紧要时,不会消耗额外的RAM或磁盘空间,并且大多数对时间不敏感的过滤器不需要任何修改。基础设施也是开放式的和可扩展的。除了支持flipbook风格的,这将允许人们回答上面提出的时间问题,它还允许人们以编程方式回答定量问题,例如:

•“在什么时候形状呈现最大体积?”

•“他们在什么时候行动最快?”

•“特定时间段内的平均属性值是多少?”

•“特定元素或位置的2D数值图是什么样的?”

11.2 VTK实施时间支持

VTK支持管道级别的时变数据。vtkExecutives是将相邻的vtkAlgorithms粘合在一起,从而组成管道的粘合剂。除了将算法连接在一起之外,高管还负责告诉每个算法该做什么。执行器通过在执行其附加的算法之前,在管道中上下传递元信息,即小块数据(存储在vtkInformation容器中)来实现这一点。例如,每个算法都有一个vtkInformation对象,该对象指定要填充的位置或空间子域。在进行时间可视化时,执行人员还会告诉每个算法何时或在什么时间点执行此操作。现在可以给每个算法一个vtkInformation对象,该对象指定处理应该发生在哪个时间子域中。

确切地说,管道现在支持时态可视化,因为它可以识别以下元信息键,并了解如何以及何时传输它们,并对它们的存在做出反应,以驱动过滤器的执行。

TIME_RANGE

该键由时变数据的读取器在管道的源或开始处注入到管道中。它包含两个浮点数,它们是读取器在时域范围内(换句话说)产生数据的最小和最大时间。

TIME_STEPS

当读取器产生的数据在离散的时间点上是精确的,这个键也会被时变数据的读取器注入到管道中。它包含任意数量的浮点数,这些浮点数可能被规则地或不规则地放置在时域内。

UPDATE_TIME_STEPS

该键被注入到管道的下游端。它包含一个或多个浮点数,这些浮点数对应于管道更新要处理的时间集。

DATA_TIME_STEPS

当更新请求到达读取器时,它可能能够也可能不能提供恰好在那个时间的结果。例如,渲染器可能会请求TIME_STEPS中两个点之间的时间。读取器将此键注入管道,以指示与响应请求产生的数据相对应的确切数据时间。

CONTINUE_EXECUTING

这个标志被注入到管道中,使管道保持迭代,以完成一组时间请求。

由于时间支持是在管道级别添加的,因此必须了解可视化管道是如何执行的,以便理解上述元信息引起的操作,从而理解VTK的时间支持可以用于什么。VTK的标准流媒体需求驱动管道分为四个阶段。同样的四个过程用于时变可视化,但它们通常(对于整个管道的子集或整个管道)在循环中迭代。

在第一次传递(称为REQUEST_DATA_OBJECT)期间,每个执行器创建一个算法所需的任何类型的空数据对象。例如,一个vtkjpereader会生成一个空的vtkImageData。当时间感知过滤器向上游非时间感知过滤器请求多个时间步长时,执行器将过滤器的输出类型更改为vtkTemporalDataSet。该输出充当每个请求时间产生的实际数据集的缓存。

在第二次传递(称为REQUEST_INFORMATION)期间,过滤器会生成关于它们将要创建的数据的任何轻量级元信息。例如,一个vtkjpereader将提供一个图像范围。这个通道从上游端开始,并向显示方向前进。在此期间,需要时间感知读取器注入它们的TIME_RANGE和TIME_STEPS键,下游过滤器和应用程序可以使用这些键来指导它们的操作。

在第三次传递(称为REQUEST_UPDATE_EXTENT)期间,过滤器从下游端开始并向读取器返回,它们同意需要输入的哪一部分来生成它们自己被请求的输出。正是在这一阶段,UPDATE_TIME_STEPS请求向后移动。

在最后一次传递(称为REQUEST_DATA)期间,算法实际上完成了请求它们的工作,这意味着对于时变数据,在请求的时间生成数据并填充DATA_TIME_STEPS参数。

起初,这似乎仍然是一种蛮力方法。人们仍然通过时间步进来制作flipbook动画,每次更新管道以绘制图像。在旧版本的VTK迭代循环中,在读取器上设置时间参数,然后呈现显示,经常这样做。在现代VTK中也是如此。从用户的角度来看,唯一的区别是所请求的时间是在呈现器而不是阅读器上设置的。然而,实施中的几个细节使VTK的新时间支持比以前更有效,更容易使用和更灵活。

首先,算法可以自由地请求和提供多次。这使得任何过滤器都可以同时考虑多个时间步,实际上合并了一个时间管道。这使得比翻页书更高级的时变可视化,例如时间步长之间的插值和高级运动模糊效果(时间轨迹)。

其次,执行者有能力自动迭代管道中没有时间意识的部分。这使得程序员不必显式地控制管道中的各个算法。要计算运行平均值,只需在平均过滤器上设置宽度或支持度作为参数,然后告诉管道执行一次。在此之前,通过显式地在多个通道上更新管道,并在每个通道上告诉读者运行平均值的活动部分所需的确切时间,可以完成此操作。

第三,执行者,甚至算法本身,都能够操纵元信息密钥,从而实现时间转移、缩放和回归等技术。这在将数据源规范化到公共参考框架等情况下非常有用。

最后,管道将缓存临时结果(也可以手动执行),并且不会同时将读取器的所有结果保存在内存中。缓存可以大大提高速度,并使同一管道在不同时间点的比较可视化等技术变得有效。

使用时间支持

由VTK程序创建的默认管道由vtkStreamingDemandDrivenPipeline Executives连接的算法组成。此执行器不执行自动迭代或临时缓存。
因此,使用VTK进行时间分析的第一步是用更新的管道替换默认管道
这是高管阶层的做法。下面的代码片段就是这样做的。要使用它,只需在创建任何过滤器之前将这两行放在程序的顶部。

vtkSmartPointer<vtkCompositeDataPipeline> cdp =
vtkSmartPointer<vtkCompositeDataPipeline>::New();
vtkAlgorithm::SetDefaultExecutivePrototype(cdp);

与任何其他类型的数据一样,使用VTK可视化时变数据的最重要步骤是将数据转换为VTK管道可以处理的格式。正如第9章所解释的,这本质上意味着找到一个阅读器,它可以读取您正在处理的文件。如果数据是时变的,您还必须确保读者知道上面(2)中描述的新管道特性,或者换句话说是有时间意识的。

VTK的读者越来越多,他们有时间意识。示例包括(以及以下的子类和相关类):

•vtkExodusReader -读者桑迪亚国家实验室的Exodus文件格式

•vtkEnsightReader -读者CEI的EnSight文件格式

•vtkLSDynaReader -读者利弗莫尔软件技术公司的多物理场仿真软件包文件

•vtkXMLReader -读者Kitware的较新的基于XML的文件格式

一旦你找到这样的阅读器,使用它就变成了实例化阅读器的问题,设置一个文件名,并调用更新。您可以通过在阅读器上调用UpdateInformation以编程的方式从文件中获得可用的时间域,并且可以通过调用SetUpdateTimeStep(int port, double time)告诉它在特定时间更新,然后调用update()。

下面的代码段演示了如何实例化一个时间感知读取器并在文件中查询它的时域。

vtkSmartPointer<vtkGenericEnSightReader> r =
vtkSmartPointer<vtkGenericEnSightReader>::New();
r->SetCaseFileName(".../VTKData/Data/EnSight/naca.bin.case");
// Update meta-data. This reads time information and other meta-data.
r->UpdateInformation();
// The meta-data is in the output information
vtkInformation* outInfo = r->GetExecutive()->GetOutputInformation(0);
if (outInfo.Has(vtkStreamingDemandDrivenPipeline::TIME_STEPS()))
 {
 cout << "Times are:" << endl;
 for(int i=0; i<outInfo-
>Length(vtkStreamingDemandDrivenPipeline::TIME_STEPS()), i++)
 {
 cout << outInfo->Get(vtkStreamingDemandDrivenPipeline::TIME_STEPS(),
i) << endl;
 }
 }
else
 {
 cout << "That file has not time content." << endl;
 }

在VTK中,越来越多的读者有时间意识,但更多的读者没有时间意识。还有更多的文件格式还没有阅读器。读者到底需要做些什么来支持时间可视化?它必须至少做两件事。它必须宣布它拥有数据的时间范围,并且必须尊重管道请求它的时间。


在REQUEST_INFORMATION管道传递期间宣布范围。这可以通过填充TIME_STEPS和TIME_RANGE键来实现。

int vtkTimeAwareReader::RequestInformation(
 vtkInformation* vtkNotUsed(request),
 vtkInformationVector** vtkNotUsed(inputVector),
 vtkInformationVector* outputVector )
{
 vtkInformation* outInfo = outputVector->GetInformationObject(0);
 // Read the time information from the file here.
 // ...
 // Let timeValues be an array of times (type double)
 // nSteps is the number of time steps in the array.
 outInfo->Set(vtkStreamingDemandDrivenPipeline::TIME_STEPS(),
timeValue, nSteps);
 double timeRange[2];
timeRange[0] = timeValue[0];
 timeRange[1] = timeValue[nSteps - 1];
 outInfo->Set(vtkStreamingDemandDrivenPipeline::TIME_RANGE(),
timeRange, 2);
 return 1;
}

读取器在REQUEST_DATA传递期间找出当前请求的时间或次数,并相应地做出响应。时间请求来自UPDATE_TIME_STEPS键。

int vtkTimeAwareReader::RequestData(
 vtkInformation* vtkNotUsed(request),
 vtkInformationVector** vtkNotUsed(inputVector),
 vtkInformationVector* outputVector )
{
 vtkInformation* outInfo = outputVector->GetInformationObject(0);
 if (outInfo->Has(
vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()))
 {
 // Get the requested time steps.
 int numRequestedTimeSteps = outInfo-
>Length(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS());
 double* requestedTimeValues = outInfo-
>Get(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS());
 double firstTime = requestedTimeValues[0];
 double lastTime = requestedTimeValues[numRequestedTimeSteps-1];
 // ...
 }
 // ..
 return 1;
}

读者可以随心所欲地解释这个请求。大多数人使用底函数来找到他们拥有数据的最接近的较小精确时间值。由于这个原因,提供阅读器产生的数据实际对应的确切时间是有用的。在输出数据对象中放置DATA_TIME_STEPS键可以做到这一点。

double myAnswerTime = this->Floor_in_timeValue(firstTime);
vtkDataObject *output= outInfo->Get(vtkDataObject::DATA_OBJECT());
output->GetInformation()->Set(vtkDataObject::DATA_TIME_STEPS(),
&myAnswerTime, 1);

在任何给定的调用中,许多读取器只能满足一个时间请求。在这种情况下,他们可以自由地生成任何特定的vtkDataSet子类。它们通常只处理前面代码中第一个请求的值。其他阅读器可以有效地满足多个时间请求。一个例子可能是阅读器的实现,用于文件格式,该格式仅存储在后续时间步骤中更改的值。在这种情况下,数据常量部分的浅拷贝是有效的。当阅读器可以多次提供数据时,它必须生成一个vtkTemporalDataSet,并为每个答案填充数据。下面是过滤器如何创建时间为0.1和0.3的数据集。

vtkSmartPointer<vtkTemporalDataSet>tds =
vtkSmartPointer<vtkTemporalDataSet>::New();
vtkSmartPointer<vtkPolyData> pd0 = vtkSmartPointer<vtkPolyData>::New();
pd0->GetInformation()->Append(vtkDataObject::DATA_TIME_STEPS(), 0.1);
tds->SetTimeStep(0, pd0);
vtkSmartPointer<vtkPolyData> pd1 = vtkSmartPointer<vtkPolyData>::New();
pd1->GetInformation()->Append(vtkDataObject::DATA_TIME_STEPS(), 0.3);
tds->SetTimeStep(1, pd1);
4) Time aware filters
(Time aware filters using)

在VTK中也有越来越多的时间感知滤波器。时态统计过滤器就是一个例子。它计算所有时间步长的输入数据中每个点和单元格的所有属性值的平均值、最小值和最大值以及标准偏差等统计信息。
在大多数情况下,如果您正在使用适当的执行器,并且在管道中有一个时间感知源或读取器,那么使用时间感知过滤器与使用任何标准过滤器没有什么不同。只需设置管道并调用update。下面的代码演示。

vtkSmartPointer<vtkTemporalStatistics> ts =
vtkSmartPointer<vtkTemporalStatistics>::New()
ts->SetInputConnection(r->GetOutputPort())
ts->Update()
cout
 << ts->GetOutput()->GetBlock(0)->GetPointData()->GetArray(1)-
>GetName()
 << endl;
cout
 << ts->GetOutput()->GetBlock(0)->GetPointData()->GetArray(1)-
>GetTuple1(0)
 << endl;
(Time aware filters creating)

尽管VTK中时间感知滤波器的数量正在增长,但它永远不会涵盖所有可能的时间分析技术。当您发现工具箱缺少所需的技术时,您可以编写一个新的过滤器。时间感知过滤器必须能够与执行器合作,以便操纵时间维度以完成其工作。例如,时态统计过滤器检查其输入上的所有时间步骤,并总结信息。在这样做的过程中,它从下游过滤器的考虑中删除了时间。绘制随时间变化的值的图形过滤器也做同样的事情。输出图沿着x轴有时间,它是“永恒的”,它本身不会随着时间的移动而改变。这样做的过滤器应该从REQUEST_INFORMATION传递的输出中删除TIME键。

int vtkTemporalStatistics::RequestInformation(
 vtkInformation *vtkNotUsed(request),
 vtkInformationVector **vtkNotUsed(inputVector),
 vtkInformationVector *outputVector)
{
 vtkInformation *outInfo = outputVector->GetInformationObject(0);
 // The output data of this filter has no time associated with it. It
is the
 // result of computations that happen over all time.
 outInfo->Remove(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
 outInfo->Remove(vtkStreamingDemandDrivenPipeline::TIME_RANGE());
 return 1;
}

时态统计过滤器生成单个值,但它需要请求自己的输入来生成它所能生成的所有时间步长。它填充UPDATE_TIME_STEPS键,以询问输入过滤器为什么时间生成数据。注意,此过滤器一次只需要检查一个时间步长,实际上是在聚合结果时流式处理时间。因此,在本例中,我们只要求下一个时间步长。其他过滤器可能会请求多个时间步,或者所有时间步,但在这样做时应注意不要占用内存。

int vtkTemporalStatistics::RequestUpdateExtent(
 vtkInformation *vtkNotUsed(request),
 vtkInformationVector **inputVector,
 vtkInformationVector *vtkNotUsed(outputVector))
{
 vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
 // The RequestData method will tell the pipeline Executive to iterate
the
 // upstream pipeline to get each time step in order. On every
iteration,
 // this method will be called first which gives this filter the
opportunity
 // to ask for the next time step.
 double *inTimes = inInfo-
>Get(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
 if (inTimes)
 {
 inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS(),
 &inTimes[this->CurrentTimeIndex], 1);
 }
 return 1;
}

此过滤器一次检查一个时间步骤,因此它需要遍历所有时间步骤以产生正确的结果。应用程序不必为我们做迭代,因为过滤器可以告诉Executive自己去做。它设置continue_execution()标志来执行循环。在第一次调用时,过滤器设置循环并设置标志。这将导致REQUEST_UPDATE_EXTENT和REQUEST_DATA传递持续发生,直到过滤器决定删除该标志。在每次迭代中,过滤器请求不同的时间步长(参见上面的RequestUpdateExtent)。在检查了所有的时间步骤后,它清除了旗帜。此时,输出将具有计算出的总体统计信息。

int vtkTemporalStatistics::RequestData(vtkInformation *request,
 vtkInformationVector **inputVector,
 vtkInformationVector *outputVector)
{
 vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
 vtkInformation *outInfo = outputVector->GetInformationObject(0);
 vtkDataObject *input = vtkDataObject::GetData(inInfo);
 vtkDataObject *output = vtkDataObject::GetData(outInfo);
 if (this->CurrentTimeIndex == 0)
 {
 // First execution, initialize arrays.
 this->InitializeStatistics(input, output);
 }
 else
 {
 // Subsequent execution, accumulate new data.
 this->AccumulateStatistics(input, output);
 }
 this->CurrentTimeIndex++;
 if ( this->CurrentTimeIndex
 < inInfo-
>Length(vtkStreamingDemandDrivenPipeline::TIME_STEPS()))
 {
 // There is still more to do.
 request-
>Set(vtkStreamingDemandDrivenPipeline::CONTINUE_EXECUTING(), 1);
 }
 else
 {
 // We are done. Finish up.
 this->PostExecute(input, output);
 request-
>Remove(vtkStreamingDemandDrivenPipeline::CONTINUE_EXECUTING());
this->CurrentTimeIndex = 0;
 }
 return 1;
}

在前面的示例中,过滤器被编写为每次查看一个时间步骤。对于其他操作,这可能不太实际,例如几何插值需要两个时间步长。这个示例演示了过滤器如何同时请求多个时间步并一起处理它们。要请求多个时间步骤,可以将UPDATE_TIME_STEPS设置为在REQUEST_UPDATE_EXTENT传递期间包含多个值。

int vtkSimpleTemporalInterpolator::RequestUpdateExtent (
 vtkInformation * vtkNotUsed(request),
 vtkInformationVector **inputVector,
 vtkInformationVector *outputVector)
{
 // get the info objects
 vtkInformation* outInfo = outputVector->GetInformationObject(0);
 vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
 // Find the time step requested by downstream
 if (outInfo-
>Has(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()))
 {
 if (outInfo-
>Length(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()) != 1)
 {
 vtkErrorMacro("This filter can only handle 1 time request");
 return 0;
 }
 upTime =
 outInfo-
>Get(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS())[0];
 double inUpTimes[2];
// Find two time steps that surround upTime here and set inUpTimes
// This requests two time steps from upstream.
 inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS(),
 inUpTimes, 2);
 }
 return 1;
}

现在,REQUEST_DATA将只被调用一次,但是当它被调用时,它将得到一个包含两个时间步长的临时数据集。这些可以提取和处理如下:

int vtkSimpleTemporalInterpolator::RequestData(
 vtkInformation *vtkNotUsed(request),
vtkInformationVector **inputVector,
 vtkInformationVector *outputVector)
{
 vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
 vtkInformation *outInfo = outputVector->GetInformationObject(0);
 vtkTemporalDataSet *inData = vtkTemporalDataSet::SafeDownCast(
 inInfo->Get(vtkDataObject::DATA_OBJECT()));
 vtkTemporalDataSet *outData = vtkTemporalDataSet::SafeDownCast(
 outInfo->Get(vtkDataObject::DATA_OBJECT()));
 // get the input times
 double *inTimes = inData->GetInformation()-
>Get(vtkDataObject::DATA_TIME_STEPS());
 int numInTimes = inData->GetInformation()-
>Length(vtkDataObject::DATA_TIME_STEPS());
 // get the requested update time
 upTime =
 outInfo-
>Get(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS())[0];
 vtkDataObject *in0 = inData->GetTimeStep(0);
 vtkDataObject *in1 = inData->GetTimeStep(1);
 // Interpolate in0 and in1 at upTime and produce outData here.
 // set the resulting time
 outData->GetInformation()->Set(vtkDataObject::DATA_TIME_STEPS(),
 upTime, 1);
 return 1;
}

本书为英文翻译而来,供学习vtk.js的人参考。

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

vtk用户指南 第十一章 随时间变化的数据 的相关文章

  • 页面在 Google Adwords 转化跟踪上重定向

    我有一个表单 人们可以在其中提交数据 然后使用 ajax 将数据发送到服务器 我已将其设置为 Google Adwords 中的转化 下面是我使用过的代码 问题是 当用户提交表单时 在收到响应后 它会重定向回我给出的 URL 我不想重定向
  • 从 Javascript 中的嵌套函数返回值[重复]

    这个问题在这里已经有答案了 考虑这段代码 缩短 function getSecret db transaction function transaction transaction executeSql SELECT FROM table
  • 提升变量有目的吗?

    我最近学习了很多 JavaScript 并且一直在尝试理解提升变量的值 如果有的话 我 现在 明白JS是一个两遍系统 它编译然后执行 另外 我知道 var 关键字 存在 在它声明的词法范围中 因此如果在引擎为其赋值之前调用它 那么它是 未定
  • 在 onclick 事件上请求麦克风

    有一天 我偶然发现了这个 Javascript 录音机的例子 http webaudiodemos appspot com AudioRecorder index html http webaudiodemos appspot com Au
  • 如何检查是否存在可能的路径?

    我正在开发一个基于 javascript 的实验性游戏 玩家必须在二维平铺地图上移动才能退出 请随意检查这个小提琴并演奏 http jsfiddle net moonlife 74vLd 我只是随机放置障碍物 但有时障碍物会挡住玩家和出口之
  • Chrome 扩展程序可以相互通信吗?

    我正在编写一个Chrome扩展程序 并且想要实现一个接口或api 以便我将来制作的其他扩展程序可以使用它 最终的效果可能如下 分机 B 呼叫extensionA someMethod someParameters 并向分机A发送一些数据 分
  • 在 JavaScript 函数中加载图像

    我有获取图像像素颜色的功能 function getImage imgsrc var img img src imgsrc var imageMap new Object img load function var canvas
  • 有什么方法可以复制 div 的渲染 HTML 吗?

    我正在开发电子邮件签名生成器 我想通过按按钮复制最终签名 而不是手动选择签名并将其复制到剪贴板 这意味着我需要它们的图像 文本和样式 我尝试了几种变体 包括 w3schools 的变体 但没有成功 其中一些只是复制文本 但没有样式 例子 h
  • jQuery 可以操作插入的元素吗?

    我是 jQuery 的新手 我认为 jQuery 可以操作由代码添加的元素是合理的 但我发现现在还不能 function addVideo click function publisher append div div
  • 需要参数的addEventListener(和removeEventListener)函数

    我需要向 8 个对象 手掌 添加一些侦听器 这些对象是相同的 但行为必须根据它们的位置而改变 我有以下 丑陋的 代码 root palmsStatus B B B B B B B B if root palmsStatus 0 N root
  • 仅在 Chrome 上我收到此错误:Uncaught TypeError: Illegal constructor [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 当我在 Chrome 上加载 jQuery 时 我会收到此错误 Uncaught TypeError Illegal constr
  • “require(...)”是常见的 JavaScript 模式还是库函数?

    我通常发现这是 node js 脚本 模块以及 phantomJS casperJS 等中的第一行 我很好奇 这是否是服务器端 javascript SSJS 的常见模式 类似于 include在 C C 中或import在 Java 中
  • 转义 \u200b(零宽度空格)和其他非法 JavaScript 字符

    我有一组 JavaScript 对象 我引导到后端模板 以在页面加载时初始化我的 Backbone js 集合 它看起来像这样 作为 Twig 模板 我遇到的问题是某些文本字段包含 u200b 零宽度空格 这会破坏
  • 如何调试超时等待异步 Angular 任务?无法在角度页面上找到元素

    编辑 请注意 在 ernst zwingli 的帮助下 我找到了问题的根源 因此 如果您遇到相同的错误 他指出的修复之一可能会帮助您 我的问题是量角器本身的一个已知问题 如果您认为这可能是您 我已经扩展了我的步骤 以在我最初的问题之后查明问
  • 自调用函数未定义

    如果我声明一个函数文字 var x function alert hi console log x returns the function code However var x function alert hi console log
  • Next.js:错误:React.Children.only 期望接收单个 React 元素子元素

    我有一个名为Nav inside components目录及其代码如下所示 import Link from next link const Nav gt return div a Home a a About a div export d
  • 如何在具有相同值的下拉菜单上触发 jQuery 更改事件

    即使用户选择相同的值 如何每次都触发 jQuery 更改事件 我需要刷新效果 例如如果用户选择Lawyer它会发出警报hello然后用户再次选择Lawyer从下拉菜单中 它应该发出警报hello 我怎样才能实现它 以下是代码 jQuery
  • 在 Android Chrome 中隐藏 HTML5 音频/视频通知

    我的网络应用程序上有一个 HTML5 音频元素 在某些时候 我使用以下代码以编程方式停止播放 audioElement pause audioElement currentTime 0 播放音频时 我的 Android 设备 使用 Goog
  • 选择单选按钮时隐藏/显示 3 个文本框

    我有 2 个单选按钮 选择一个文本框时 我想显示 3 个文本框 并在选择其他文本框时隐藏它 这是代码 这是我的 2 个单选按钮
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对

随机推荐

  • windows下的grep == findstr

    windows下的grep 51CTO博客 windows grep
  • win10任务栏透明?教你轻松搞定

    windows 10的任务栏一直是用户桌面的焦点之一 为了提升用户体验 许多人希望让任务栏变得更加美观 其中之一就是使任务栏透明 本文将为您揭示win10任务栏透明的奥秘 介绍三种方法 让您的任务栏焕然一新 方法1 系统设置 透明的任务栏不
  • 10000亿规模AIGC产业,谁会成为下一个“巨头”?

    ChatGPT的热潮带火了大语言模型 也让AIGC插上了效率的翅膀 Midjourney 妙鸭相机等产品相继走入大众用户视线 根据艾瑞咨询的预测 2023年中国AIGC产业规模约为143亿元 而随着相关生态的完善 到2030年 中国AIGC
  • OpenAI公布ChatGPT安全框架

    12月19日 OpenAI在官网公布了 准备框架 Preparedness Framework 测试版 该文档详细介绍了OpenAI是如何保证ChatGPT等产品的安全防护措施 开发和部署流程 OpenAI表示 随着大模型的功能迭代不断完善
  • 三星手机如何录屏?让你轻松成为录屏专家

    三星手机怎么录屏呀 最近需要录一场很重要的线上视频会议 眼看时间就要到了 就是找不到手机的录屏在哪里 真的不知道该怎么办了 这场会议对我来说非常重要 有没有人会用三星手机录屏的 教教我 随着智能手机功能的不断提升 录制手机屏幕成为许多用户分
  • 在 Ubuntu 22.04 上安装 .NET 8

    1 增加微软包安装源 wget https packages microsoft com config ubuntu 22 04 packages microsoft prod deb O packages microsoft prod d
  • AI写作范文:心血管内科护理风险因素分析及防范对策

    1 引言 1 1 心血管内科的重要性与护理挑战 1 2 研究背景与论文的研究目的 2 心血管内科护理风险因素的现状分析 2 1 国内外心血管内科护理风险研究进展 2 2 心血管内科常见护理风险因素总结 3 心血管内科护理风险因素具体分析 3
  • mes系统的核心功能是什么?

    MES 定义为 位于上层的计划管理系统与底层的工业控制之间的面向车间层的管理信息系统 它为操作人员 管理人员提供计划的执行 跟踪以及所有资源 人 设备 物料 客户需求等 的当前状态 目的是解决工厂生产过程的黑匣子问题 实现生产过程的可视化
  • vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果

    一 实现效果 使用echarts实现省市地图绘制 根据数据在地图显示柱状图 根据数据显示数据 涟漪效果 二 实现方法 1 安装echarts插件 npm install echarts save 2 获取省市json数据 https dat
  • Https图片链接下载问题

    1 获取方法 入参是一个Url 和一个随机的名称 返回值是MultipartFile 这里因为我这里需要调接口传到服务器 这里也可以直接通过inputStream进行操作 按需修改 通过Url获取文件 param url param fil
  • 搭建Eureka服务

    搭建Eureka服务 文章目录 搭建Eureka服务 搭建EurekaServer 注册user service 注册多个实例 在order service中完成服务拉取和负载均衡
  • DTO/DO/VO分层与拷贝

    作者简介 大家好 我是smart哥 前中兴通讯 美团架构师 现某互联网公司CTO 联系qq 184480602 加我进群 大家一起学习 一起进步 一起对抗互联网寒冬 这一篇其实没太多实质内容 本来不打算写的 但想到当初从传统通信行业跳到互联
  • 迪普防火墙开局登录

    文章内容来自迪普官方 产品文档 杭州迪普科技股份有限公司
  • H3C 交换机指示灯说明

    端口模式指示灯 mode 为了使用户通过交换机各类型端口的 端口状态指示灯 能够获取更多的设备信息 本系列交换机 S5560S 28F EI 和 S5560S 52F EI 除外 的同一个 10 100 1000BASE T 自适应以太网端
  • H3C AC双链路备份基本组网典型配置举例

    1 6 1 双链路备份基本组网典型配置举例 1 组网需求 AP 通过 Router A 与 AC 1 和 AC 2 连接 要求使用双链路备份对 AC 进行备份 AC 1 工作在主用状态 AC 2 工作在备用状态 当 AC 1
  • 基于SpringBoot+Vue的科研项目验收管理系统设计实现(源码+lw+部署文档+讲解等)

    文章目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的
  • AWS解决方案架构师学习与备考

    系列文章目录 送书第一期 用户画像 平台构建与业务实践 送书活动之抽奖工具的打造 获取博客评论用户抽取幸运中奖者 送书第二期 Spring Cloud Alibaba核心技术与实战案例 送书第三期 深入浅出Java虚拟机 送书第四期 AI时
  • 2015,TEVC,Adaptive MOPSO Based on Parallel Cell Coordinate System

    Abstract 在多目标粒子群优化 MOPSO 的设计中 管理收敛性和多样性是至关重要的 以搜索真实Pareto最优前沿的准确和良好分布的近似 粒子群优化算法由于其快速收敛性 在进化过程中会导致多样性的快速丢失 现有的MOPSOs在 le
  • OneNote笔记使用记录

    1 快捷键 2 快速设置行距 Ctrl 1 设置一倍行距 Ctrl 2 两倍行距 Ctrl 5 1 5 倍行距 3 切换样式标题 Ctrl Alt 1 标题 1 Ctrl Alt 2 标题 2 Ctrl Alt 3 标题 3 Ctrl Sh
  • vtk用户指南 第十一章 随时间变化的数据

    11 1时序支持简介 创建可视化工具包的目的是允许人们可视化 从而探索具有空间范围的数据中的特征 它允许人们回答一些问题 比如 在这些数据中 最大价值的区域在哪里 它们有什么形状和价值 以及 这些形状是如何分布的 VTK提供了大量的技术来显