- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在计算坐标时遇到了一点问题。给定的是两个列表中的翼型剖面,具有以下示例性坐标:
例子:
x_Coordinates = [1, 0.9, 0.7, 0.5, 0.3, 0.1, 0.0, ...]
y_Coordinates = [0, -0.02, -0.06, -0.08, -0.10, -0.05, 0.0, ...]
图1:
关于配置文件的唯一已知信息是上面的列表和以下事实:
现在我要确定
直到现在,我一直使用最小的 x 坐标作为前沿。但是,这在以下示例性轮廓,因为最小的 x 坐标位于轮廓的上表面。
图2:
有没有人知道我如何轻松计算/确定这些数据?
编辑
一个完整的样本数组数据
(1.0, 0.95, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.25, 0.2, 0.15, 0.1, 0.075, 0.05, 0.025, 0.0125, 0.005, 0.0, 0.005, 0.0125, 0.025, 0.05, 0.075, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 1.0)
(0.00095, 0.00605, 0.01086, 0.01967, 0.02748, 0.03423, 0.03971, 0.04352, 0.04501, 0.04456, 0.04303, 0.04009, 0.03512, 0.0315, 0.02666, 0.01961, 0.0142, 0.0089, 0.0, -0.0089, -0.0142, -0.01961, -0.02666, -0.0315, -0.03512, -0.04009, -0.04303, -0.04456, -0.04501, -0.04352, -0.03971, -0.03423, -0.02748, -0.01967, -0.01086, -0.00605, -0.00095)
最佳答案
好几年了,我用翅膀做了一些事情。
我没有任何倾斜的翅膀数据,因为在你的图像上我发现最接近的是这个:
leading edge 对于非平凡的机翼不正确
找到dx
符号翻转的点并计算
dx(i)=x(i)-x(i-1)
然后标记 dx
为正或负的区域,并找到它们之间的中间值(通常是该区域的 dx==0
)。将边缘点标记为 ix1
弧线
对于精确的几何图形,您将需要从每一侧转换的法线的交点,因此:
i
开始这是可行的,但非常复杂
近似弧线
不太精确但速度更快所以:
i
开始axis0
点。对所有点 i=(0-ix1)
(红线)执行此操作axis1
(深红色)axis0,axis1
之间的平均值这可以用同样的方式完成,结果是蓝轴折线
C++ 源代码:
List<double> pnt; // outline 2D pnts = {x0,y0,x1,y1,x2,y2,...}
List<double> axis; // axis line 2D pnts = {x0,y0,x1,y1,x2,y2,...}
int ix0,ix1; // edge points
void compute()
{
int i,i0,i1;
double d,dd;
double *p0,*p1,*p2;
double x0,x1,y0,y1;
List<double> axis0,axis1;
// find leading edge point
ix0=0; ix1=0;
for (p0=pnt.dat,p1=p0+2,p2=p1+2,i=2;i<pnt.num;i+=2,p0=p1,p1=p2,p2+=2)
if ((p1[0]-p0[0])*(p2[0]-p1[0])<=0.0) { ix1=i; break; }
// find axis0: midpoint of i0=(0-ix1) i1=find closest from (ix1,pnt.num)
for (i0=2,i1=pnt.num-2;i0<ix1-2;i0+=2)
{
x0=pnt[i0+0];
y0=pnt[i0+1];
for (d=-1.0,i=i1;i>ix1+2;i-=2)
{
x1=pnt[i+0];
y1=pnt[i+1];
dd=((x1-x0)*(x1-x0))+((y1-y0)*(y1-y0));
if ((d<0.0)||(dd<=d)) { i1=i; d=dd; }
}
if (d>=0.0)
{
x1=pnt[i1+0];
y1=pnt[i1+1];
axis0.add(0.5*(x0+x1));
axis0.add(0.5*(y0+y1));
}
}
// find axis1: midpoint of i0=(ix1,pnt.num) i1=find closest from (0,ix1)
for (i1=2,i0=pnt.num-2;i0>ix1+2;i0-=2)
{
x0=pnt[i0+0];
y0=pnt[i0+1];
for (d=-1.0,i=i1;i<ix1-2;i+=2)
{
x1=pnt[i+0];
y1=pnt[i+1];
dd=((x1-x0)*(x1-x0))+((y1-y0)*(y1-y0));
if ((d<0.0)||(dd<=d)) { i1=i; d=dd; }
}
if (d>=0.0)
{
x1=pnt[i1+0];
y1=pnt[i1+1];
axis1.add(0.5*(x0+x1));
axis1.add(0.5*(y0+y1));
}
}
// find axis: midpoint of i0=<0-axis0.num) i1=find closest from <0-axis1.num)
axis.add(pnt[ix0+0]);
axis.add(pnt[ix0+1]);
for (i0=0,i1=0;i0<axis0.num;i0+=2)
{
x0=axis0[i0+0];
y0=axis0[i0+1];
for (d=-1.0,i=i1;i<axis1.num;i+=2)
{
x1=axis1[i+0];
y1=axis1[i+1];
dd=((x1-x0)*(x1-x0))+((y1-y0)*(y1-y0));
if ((d<0.0)||(dd<=d)) { i1=i; d=dd; }
}
if (d>=0.0)
{
x1=axis1[i1+0];
y1=axis1[i1+1];
axis.add(0.5*(x0+x1));
axis.add(0.5*(y0+y1));
}
}
axis.add(pnt[ix1+0]);
axis.add(pnt[ix1+1]);
}
List<double> xxx;
只是我的动态列表模板,和double xxx[];
一样xxx.add(5)
;将 5 添加到列表末尾xxx[7]
访问数组元素xxx.num
为数组实际使用的大小xxx.reset()
清空数组并设置xxx.num=0[edit1] 正确的前沿点
有一个疯狂的想法,在运行中找到边缘点加上一些代码调整,结果对我来说已经足够好了:)所以首先解释一下:
轴的算法保持不变,但不是 ix1
绑定(bind),只使用尚未使用的点...如果没有找到停止点(顶部图像情况),也只计算有效的最近点(在另一侧)。从这一点找到离最后一个轴点最远的点,这是前缘点。
这种方法有非常准确的输出(axis0,axis1
更接近)
现在是 C++ 代码:
void compute()
{
int i,i0,i1,ii,n=4;
double d,dd;
double x0,x1,y0,y1;
List<double> axis0,axis1;
ix0=0; ix1=0;
// find axis0: midpoint of i0=(0-ix1) i1=find closest from (ix1,pnt.num)
for (i0=0,i1=pnt.num-2;i0+n<i1;i0+=2)
{
x0=pnt[i0+0];
y0=pnt[i0+1];
i=i1+n; if (i>pnt.num-2) i=pnt.num-2; ii=i1;
for (d=-1.0;i>i0+n;i-=2)
{
x1=pnt[i+0];
y1=pnt[i+1];
dd=((x1-x0)*(x1-x0))+((y1-y0)*(y1-y0));
if ((d<0.0)||((dd<=d)&&(dd>1e-10))) { i1=i; d=dd; }
if ((d>=0.0)&&(dd>d)) break;
}
if (d>=0.0)
{
if (i1-i0<=n+2) { i1=ii; break; } // stop if non valid closest point found
x1=pnt[i1+0];
y1=pnt[i1+1];
axis0.add(0.5*(x0+x1));
axis0.add(0.5*(y0+y1));
}
}
// find leading edge point (the farest point from last found axis point)
x0=axis0[axis0.num-2];
y0=axis0[axis0.num-1];
for (d=0.0,i=i0;i<=i1;i+=2)
{
x1=pnt[i+0];
y1=pnt[i+1];
dd=((x1-x0)*(x1-x0))+((y1-y0)*(y1-y0));
if (dd>d) { ix1=i; d=dd; }
}
axis0.add(pnt[ix1+0]);
axis0.add(pnt[ix1+1]);
// find axis1: midpoint of i0=(ix1,pnt.num) i1=find closest from (0,ix1)
for (i1=0,i0=pnt.num-2;i0+n>i1;i0-=2)
{
x0=pnt[i0+0];
y0=pnt[i0+1];
i=i1-n; if (i<0) i=0; ii=i1;
for (d=-1.0;i<i0-n;i+=2)
{
x1=pnt[i+0];
y1=pnt[i+1];
dd=((x1-x0)*(x1-x0))+((y1-y0)*(y1-y0));
if ((d<0.0)||((dd<=d)&&(dd>1e-10))) { i1=i; d=dd; }
if ((d>=0.0)&&(dd>d)) break;
}
if (d>=0.0)
{
if (i0-i1<=n+2) { i1=ii; break; } // stop if non valid closest point found
x1=pnt[i1+0];
y1=pnt[i1+1];
axis1.add(0.5*(x0+x1));
axis1.add(0.5*(y0+y1));
}
}
// find leading edge point (the farest point from last found axis point)
x0=axis1[axis1.num-2];
y0=axis1[axis1.num-1];
for (d=0.0,i=i1;i<=i0;i+=2)
{
x1=pnt[i+0];
y1=pnt[i+1];
dd=((x1-x0)*(x1-x0))+((y1-y0)*(y1-y0));
if (dd>d) { ix1=i; d=dd; }
}
axis1.add(pnt[ix1+0]);
axis1.add(pnt[ix1+1]);
// find axis: midpoint of i0=<0-axis0.num) i1=find closest from <0-axis1.num)
for (i0=0,i1=0;i0<axis0.num;i0+=2)
{
x0=axis0[i0+0];
y0=axis0[i0+1];
for (d=-1.0,i=i1;i<axis1.num;i+=2)
{
x1=axis1[i+0];
y1=axis1[i+1];
dd=((x1-x0)*(x1-x0))+((y1-y0)*(y1-y0));
if ((d<0.0)||(dd<=d)) { i1=i; d=dd; }
}
if (d>=0.0)
{
x1=axis1[i1+0];
y1=axis1[i1+1];
axis.add(0.5*(x0+x1));
axis.add(0.5*(y0+y1));
}
}
}
常量 n=4
只是为了安全地重叠搜索最近点,它应该是 pnt.num
的一小部分。有时最近点在最后找到的最近点之前,这取决于展位侧面的曲率。太大的 n
会导致速度变慢,如果 n>pnt.num/4
它也可能使输出无效。
如果太小,那么对于较小的曲率半径会降低精度,这种方法依赖于足够的点覆盖。如果用太低的点数对机翼进行采样,可能会导致不准确。源代码是几乎相同的东西的 3 倍你可以选择记住哪个 ix1
(从第一次或第二次搜索)它们是相邻点
测试配置文件:
1.000000 0.000000
0.990000 0.006719
0.980000 0.013307
0.970000 0.019757
0.960000 0.026064
0.950000 0.032223
0.940000 0.038228
0.930000 0.044075
0.920000 0.049759
0.910000 0.055276
0.900000 0.060623
0.890000 0.065795
0.880000 0.070790
0.870000 0.075604
0.860000 0.080234
0.850000 0.084678
0.840000 0.088935
0.830000 0.093001
0.820000 0.096876
0.810000 0.100558
0.800000 0.104046
0.790000 0.107339
0.780000 0.110438
0.770000 0.113342
0.760000 0.116051
0.750000 0.118566
0.740000 0.120887
0.730000 0.123016
0.720000 0.124954
0.710000 0.126702
0.700000 0.128262
0.690000 0.129637
0.680000 0.130829
0.670000 0.131839
0.660000 0.132672
0.650000 0.133331
0.640000 0.133818
0.630000 0.134137
0.620000 0.134292
0.610000 0.134287
0.600000 0.134127
0.590000 0.133815
0.580000 0.133356
0.570000 0.132755
0.560000 0.132016
0.550000 0.131146
0.540000 0.130148
0.530000 0.129030
0.520000 0.127795
0.510000 0.126450
0.500000 0.125000
0.490000 0.123452
0.480000 0.121811
0.470000 0.120083
0.460000 0.118275
0.450000 0.116392
0.440000 0.114441
0.430000 0.112429
0.420000 0.110361
0.410000 0.108244
0.400000 0.106085
0.390000 0.103889
0.380000 0.101663
0.370000 0.099414
0.360000 0.097148
0.350000 0.094870
0.340000 0.092589
0.330000 0.090309
0.320000 0.088037
0.310000 0.085779
0.300000 0.083541
0.290000 0.081329
0.280000 0.079149
0.270000 0.077006
0.260000 0.074906
0.250000 0.072855
0.240000 0.070858
0.230000 0.068920
0.220000 0.067047
0.210000 0.065242
0.113262 0.047023
0.110002 0.042718
0.106385 0.038580
0.102428 0.034615
0.098146 0.030832
0.093556 0.027239
0.088673 0.023844
0.083516 0.020652
0.078101 0.017670
0.072448 0.014904
0.066574 0.012361
0.060499 0.010044
0.054241 0.007958
0.047820 0.006108
0.041256 0.004497
0.034569 0.003129
0.027779 0.002005
0.020907 0.001129
0.013972 0.000502
0.006997 0.000126
0.000000 0.000000
0.000000 0.000000
-0.003997 0.000126
-0.007972 0.000502
-0.011907 0.001129
-0.015779 0.002005
-0.019569 0.003129
-0.023256 0.004497
-0.026820 0.006108
-0.030241 0.007958
-0.033499 0.010044
-0.036574 0.012361
-0.039448 0.014904
-0.042101 0.017670
-0.044516 0.020652
-0.046673 0.023844
-0.048556 0.027239
-0.050146 0.030832
-0.051428 0.034615
-0.052385 0.038580
-0.053002 0.042718
-0.053262 0.047023
-0.053153 0.051484
-0.052659 0.056093
-0.051768 0.060841
-0.050467 0.065717
-0.048744 0.070711
-0.046588 0.075813
-0.043988 0.081012
-0.040935 0.086297
-0.037420 0.091658
-0.033435 0.097082
-0.028972 0.102558
-0.024025 0.108074
-0.018589 0.113618
-0.012657 0.119178
-0.006228 0.124741
0.000704 0.130295
0.008139 0.135828
0.016079 0.141326
0.024525 0.146777
0.033475 0.152169
0.042930 0.157488
0.052885 0.162722
0.063339 0.167858
0.074287 0.172883
0.085723 0.177784
0.097643 0.182549
0.110038 0.187166
0.122902 0.191621
0.136226 0.195903
0.150000 0.200000
0.164214 0.203899
0.178856 0.207590
0.193914 0.211059
0.209376 0.214297
0.225227 0.217291
0.241453 0.220032
0.258039 0.222509
0.274968 0.224711
0.292223 0.226629
0.309787 0.228254
0.327641 0.229575
0.345766 0.230585
0.364142 0.231274
0.382749 0.231636
0.401566 0.231662
0.420570 0.231345
0.439740 0.230679
0.459054 0.229657
0.478486 0.228274
0.498015 0.226525
0.517615 0.224404
0.537262 0.221908
0.556930 0.219032
0.576595 0.215775
0.596231 0.212132
0.615811 0.208102
0.635310 0.203684
0.654700 0.198876
0.673956 0.193679
0.693050 0.188091
0.711955 0.182115
0.730644 0.175751
0.749091 0.169002
0.767268 0.161869
0.785149 0.154357
0.802706 0.146468
0.819913 0.138207
0.836742 0.129580
0.853169 0.120591
0.869166 0.111246
0.884707 0.101553
0.899768 0.091518
0.914322 0.081149
0.928345 0.070455
0.941813 0.059445
0.954701 0.048128
0.966987 0.036514
0.978646 0.024614
0.989658 0.012439
1.000000 0.000000
关于python - 翼型剖面几何绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25958883/
我正在尝试编写一个函数来制作绘图并将其自动保存到文件中。 我努力用它来动态地做的技巧[plotname=varname & filename=varname &], 并使其与从循环中调用它兼容。 #
有人可以帮助我如何在绘图条形图中添加“下拉”菜单。 我在以下链接 ( https://plot.ly/python/v3/dropdowns/ ) 上找到了一些信息,但我正在努力调整代码,因此下拉选项
我不确切知道如何表达这一点,但我本质上希望根据其他数据之前的列值将数据分组为 Excel 图的系列。例如: size weight apple 3 35 orange 4
我正在为出版物创建图表并希望它们具有相同的字体大小。 当我用多图创建图形时,字体大小会减小,即使我没有更改tiff() 分辨率或pointsize 参数。我根据最终适合的地 block 数量增加了图形
我用 glm::perspective(80.0f, 4.0f/3.0f, 1.0f, 120.0f);并乘以 glm::mat4 view = glm::lookAt( glm::vec3(
我在 Shiny UI 中有一个情节。如果我更改任何输入参数并且通过 react 性图将会改变。但是让我们考虑以下情况:- Shiny UI 中的绘图可以说股票的日内价格变动。为此,您查询一些实时数据
我对 R 有点陌生。我在以下两个线程中跟踪并实现了结果: http://tolstoy.newcastle.edu.au/R/e17/help/12/03/7984.html http://lukem
我想在 WPF 控件中使用 GDI+ 绘图。 最佳答案 有多种方法可以做到这一点,最简单的方法是锁定您使用 GDI 操作的位图,获取像素缓冲区(从锁定中获取的 BitmapData 中的 Scan0
如何在以下取自其网站的绘图示例中隐藏颜色条? df % layout(title = '2014 Global GDPSource:CIA World Factbook',
我有两列数据,X 和 Y,每个条目在两个向量的小数点后都有 4 位数据。 当我使用 plot(x,y) 绘制简单图时,轴上显示的数据精确到小数点后两位。如何在两个轴上将其更改为小数点后 4 位精度?
我目前正在使用 Canvas 处理 JavaFX-Drawing-Application。在 GraphicsContext 的帮助下,我使用 beginPath() 和 lineTo() 方法绘制线
如果这个问题已经得到解答,但我无法找到我需要的东西,我提前道歉。我想从名为 data1.dat、data2.dat 的文件中绘制一些结果......我设法通过循环导入数据,但我无法使用循环绘制结果。仅
我的 pandas 数据框中有一个功能,可以(可能)具有多个级别。我可以使用以下方法获得独特的级别: reasons = df["Reason"].unique() 我可以通过执行以下操作在单个图表上
我在 Ubuntu 14 和 Windows 7(均为 64 位)中用 Python 绘制结果时遇到问题。作为一个简单的比较,我做了: from tvb.simulator.lab import *
以下代码相当简单 - 它用随机选择的像素填充设计表面 - 没什么特别的(暂时忽略第二种方法中的 XXXXXXX)。 private void PaintBackground() { Rando
我正在尝试制作一个绘制函数图形的 swing 应用程序(现在很简单,例如 x+2)但我在根据屏幕坐标制作我的点的数学坐标时遇到问题。我希望它在我的图表中简单地画一条从 P1(0,1) 到 P2(1,2
编辑 4:问题的新格式 背景:我有一个扩展 JFrame 的类 Window,在 JFrame 中我有一个 Canvas 。我向 Canvas 添加自定义对象。这个对象的唯一目的(为了争论)是在 Ca
我需要为即将到来的锦标赛标记阶梯,但我找不到任何方法来语义标记它。到目前为止我看到的唯一方法是 mark it up as a table ,我想不惜一切代价避免这种情况。 有什么想法吗? 最佳答案
我目前正在为一个小型 uC 项目编写 UI。在计算垂直线的位置时遇到一些问题。这个想法是将红线沿 x 轴移动到矩形的末端。 使用无限旋转编码器递增的值,范围为 0 到 800,增量为 1。矩形的左侧是
我正在尝试绘制光分布图。我想准确地执行此问题的第一步所要求的:Statistical analysis on Bell shaped (Gaussian) curve . 现在我有一组值。我希望数组元
我是一名优秀的程序员,十分优秀!