- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
关于附图,我需要一个计算算法来将 A 轴向下移动 n 英寸,将 B 轴从左向右移动 m 英寸,以便组件圆 D 遵循抛物线的曲线;圆 D 并不总是 10 英寸,可以更小。我不是数学专业的,所以这对我来说有点复杂。我知道我在 A 轴上有一个必须计算的弧长(我不知道该怎么做。),然后我在 B 轴上也有一个弧长并且弧正在引用的位置移动轴 A,与圆 D 的直径相关联的弧长将决定圆 D 和抛物线之间的交点在抛物线上的位置。为了从左到右跟随抛物线的曲线,反之亦然 - 我需要一个公式来跟随抛物线。考虑 D 大小的变化。有人可以提供一些关于如何做到这一点的答案吗?一个很好的公式,带有一些解释性信息 - 至少足够详细,我可以搜索这些部分和位以了解要做什么。
最佳答案
看来您需要计算作为抛物线偏移的曲线。
在接下来的 C++ 程序中,我将展示如何首先找到抛物线的公式,然后如何计算该曲线的偏移量,最后如何找到两个轴彼此形成的角度。
我将点 (0,0) 视为抛物线的左端,该点(顶点)的底部将位于坐标 (12,-8.75),而右端位于 (24,0)。以这张图为引用(抛物线为蓝色,圆心轨迹为橙色):
请注意,如果圆太大,虽然它在一侧相切,但它可能会在另一侧与抛物线相交。我不确定 12"是抛物线的总宽度还是只有一半,但在后一种情况下,10"的工具会太大:
程序会打印出代表刀具的圆与抛物线相切点的坐标、对应的圆心坐标(刀具的位置)和角度的一些样本(25)两个轴(alpha 和 beta)。
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
using std::cout;
using std::setw;
using std::vector;
int main() {
// set number of steps or points of approximation
int n_steps = 25;
// declare vectors to store coordinates into
vector<double> x2(n_steps), y2(n_steps);
// calculate the parameters of the parabola expressed by the formula
// y = ax^2 + bx + c
// Knowing 2 points, one of which is the vertex.
// xv = -b/2a | b = -2axv
// y0 = ax0^2 + bx0 + c => | yv - y0 = a(xv^2 - x0^2) + b(xv - x0)
// yv = axv^2 + bxv + c | yv - y0 = a(xv - x0)(xv + x0) + b(xv - x0)
//
// a ((xv - x0)*(xv + x0) - 2xv(xv - x0)) = yv - y0
// a (xv - x0)*(xv + x0 - 2xv) = yv - y0
// Known coordinates
double xv = 12.0,
yv = -8.75,
x0 = 0.0,
y0 = 0.0;
double dx = xv - x0,
a = (y0 - yv) / ( dx * dx ),
b = - 2.0 * a * xv,
c = y0 - x0 * ( a * x0 + b );
cout << "Parabola formula:\n"
<< "y = " << a << "x^2 + " << b << "x + " << c << "\n\n"
<< "max acceptable diameter: " << 1.0 / a << "\n\n";
// Coordinates of rotating axes, extrapolated from your drawing
double r1 = 13,
r2 = 9,
x1 = xv - r1,
y1 = r2;
// some helper values (constant) I'll use later
double rad_to_deg = 180.0 / M_PI,
r1quad = r1 * r1,
r2quad = r2 * r2,
rdif = r1quad - r2quad,
rsum = r1quad + r2quad,
rden = 1.0 / ( 2.0 * r1 * r2 );
// radius of the circle (tool)
double diameter = 10,
radius = diameter / 2.0;
cout << "Diameter of tool (circle): " << diameter << "\n\n";
// calculate parabola points
cout << "\t\t\tTangent\t\t\t\tCenter of circle\t\t alpha\t\tbeta\n";
// xt[0] = x0 xt[n_steps] = x0 + 2*(xv - x0)
double step = 2.0 * dx / ( n_steps - 1 );
for ( int i = 0; i < n_steps; ++i ) {
// calculate the tangent points which lies on the parabola
double xt = x0 + i * step,
yt = xt * ( a * xt + b ) + c;
// calculate the offset points, coordinates of the center of the circle
// first derivative of the parabola
double delta = 2.0 * a * xt + b;
// point perpendicular to the tangent at distance equal to radius
double k = radius / sqrt(delta * delta + 1.0);
x2[i] = xt - k * delta;
y2[i] = yt + k;
// distance from x,y to x1,y1
double dx1 = x2[i] - x1,
dy1 = y2[i] - y1,
r3quad = dx1 * dx1 + dy1 * dy1,
r3 = sqrt(r3quad);
// Now that I know the coordinates of the vertices of the triangle
// and the lengths of its sides I can calculate the inner angles
// using Carnot teorem, for example: a^2 = b^2 + c^2 - 2bc*cos(alpha)
double alpha_Carnot = acos((rdif + r3quad) / (2.0 * r1 * r3)),
beta_Carnot = acos((rsum - r3quad) * rden);
// angle to the orizzontal of line from x1,y1 to x,y in radians
double gamma = atan2(dy1,dx1);
// angle of Axis A to the orizzontal in degrees
double alpha = (gamma + alpha_Carnot) * rad_to_deg;
// angle of Axis B to Axis A. beta = 0 if parallel
double beta = beta_Carnot * rad_to_deg - 180.0;
// output the coordinates
cout << std::fixed << setw(4) << i << setw(10) << xt << setw(10) << yt
<< setw(15) << x2[i] << setw(10) << y2[i]
<< setw(15) << alpha << setw(12) << beta << '\n';
}
return 0;
}
这是输出:
Parabola formula:
y = 0.0607639x^2 + -1.45833x + 0
max acceptable diameter: 16.4571
Diameter of tool (circle): 10
Tangent Center of circle alpha beta
0 0.000000 0.000000 4.123644 2.827642 -7.228866 -142.502245
1 1.000000 -1.397569 5.003741 1.597437 -7.151211 -132.856051
2 2.000000 -2.673611 5.860925 0.503378 -7.962144 -123.965745
3 3.000000 -3.828125 6.690144 -0.454279 -9.159057 -115.700562
4 4.000000 -4.861111 7.485392 -1.276137 -10.496232 -108.022957
5 5.000000 -5.772569 8.239777 -1.964178 -11.833367 -100.941141
6 6.000000 -6.562500 8.945861 -2.522462 -13.081185 -94.488527
7 7.000000 -7.230903 9.596439 -2.957906 -14.180211 -88.708034
8 8.000000 -7.777778 10.185964 -3.280939 -15.093523 -83.633631
9 9.000000 -8.203125 10.712644 -3.505588 -15.805504 -79.267662
10 10.000000 -8.506944 11.180897 -3.648397 -16.321003 -75.558850
11 11.000000 -8.689236 11.603201 -3.725755 -16.659970 -72.392050
12 12.000000 -8.750000 12.000000 -3.750000 -16.845543 -69.600878
13 13.000000 -8.689236 12.396799 -3.725755 -16.889440 -67.003199
14 14.000000 -8.506944 12.819103 -3.648397 -16.782985 -64.443028
15 15.000000 -8.203125 13.287356 -3.505588 -16.499460 -61.816277
16 16.000000 -7.777778 13.814036 -3.280939 -16.005878 -59.069041
17 17.000000 -7.230903 14.403561 -2.957906 -15.277444 -56.174060
18 18.000000 -6.562500 15.054139 -2.522462 -14.309495 -53.098717
19 19.000000 -5.772569 15.760223 -1.964178 -13.126180 -49.773973
20 20.000000 -4.861111 16.514608 -1.276137 -11.788732 -46.064496
21 21.000000 -3.828125 17.309856 -0.454279 -10.409278 -41.729113
22 22.000000 -2.673611 18.139075 0.503378 -9.184425 -36.337384
23 23.000000 -1.397569 18.996259 1.597437 -8.503984 -29.006402
24 24.000000 0.000000 19.876356 2.827642 -9.577076 -16.878208
这些是不同位置的一些图片(感谢 excell):
关于利用 2 轴运动计算抛物线路径的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36136175/
在后台开启了“URL Rewrite”,看起来一切正常,可是点击某一栏目的时候却怎么都进不去,显示的依然是论坛的首页。看了一下论坛目录下,原来这下面并没有自己的.htaccess文件,所以默认使用的
本文实例为大家分享了.net发送邮件的实现代码,供大家参考,具体内容如下 关键代码: 需要引用命名空间: using System.Net.Mail; using System.Net;
今天的一个小测试是老师让用.NET用控件来制作一个拉菜单要求如下: 将鼠标移到父菜单上弹出3个子菜单,而且每个子菜单都有超链接。 以下是我自己做的代码: 复制代
我有以下内容 static const unsigned int chromosome = 6; double bestFitness[chromosomes]; for(int i = 0; i
关于附图,我需要一个计算算法来将 A 轴向下移动 n 英寸,将 B 轴从左向右移动 m 英寸,以便组件圆 D 遵循抛物线的曲线;圆 D 并不总是 10 英寸,可以更小。我不是数学专业的,所以这对我来说
我正在尝试利用我的格式字符串错误,它存在于这个程序中: #include #include #include #include #include void foo(char* tmp, ch
用Matplotlib和Seaborn这类Python库可以画出很好看的图,但是这些图只是静态的,难以动态且美观地呈现数值变化。要是在你下次的演示、视频、社交媒体Po文里能用短视频呈现数据变化,是不
1、进程介绍 进程:正在执行的程序,由程序、数据和进程控制块组成,是正在执行的程序,程序的一次执行过程,是资源调度的基本单位。 程序:没有执行的代码,是一个静态的。 2、线程
1、前言 在开发过程中,有时会遇到需要控制任务并发执行数量的需求。 例如一个爬虫程序,可以通过限制其并发任务数量来降低请求频率,从而避免由于请求过于频繁被封禁问题的发生。 接下来
Opera 管理着一个漏洞赏金计划,研究人员可以在该计划中报告 Opera 软件中的漏洞并获得奖励。 这篇文章就是我发现的一个漏洞——网页可能会从用户那里检索本地文件的屏幕截图。 考虑到 O
C++ 文件查找 在C++中我们要如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在的头文件中,结构体为struct _finddata_t ,函数为_findfi
1、前言 本文利用 fsockopen() 函数,编写一个功能简单的端口扫描器。 2、关键技术 本实例的端口号是固定的,通过对数组的遍历,利用 fsockopen() 函数连接,如果连接成功,
最近在将一些项目的rest api迁移到.net core中,最开始是用的Nginx做反向代理,将已经完成切换的部分切入系统,如下图所示: 由于迁移过程中也在进行代码重构,需要经常比较频繁的测
前言 最近学习了python,感觉挺多地方能用到它的。打包 测试 上传 爬电影....而且代码量是真少。人生苦短,我用python。而今天写的这个是因为下载电影时总会发现除了视频还会有这两个文件,
1、Monkey测试简介 Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序
一直想写一套生成静态页面的文章系统 但面对生成静态后的一些复杂数据库交互问题。又望而却步! 于是就想 有没有 在不耽误数据交互的情况下,而又能降低服务器负
Qt 利用大量第 3 方库进行图像编码、压缩、加密、音频和视频编解码器支持等。 从历史上看,当我想使用它们时,我总是必须将它们作为附加依赖项包含在内。我一直想知道是否有一种方法可以简单地重用 Qt 已
我想知道是否可以使用属性将功能“混合”到类/方法/属性中。 就像是: [TrackChanges] public Foo { get; set; } 如果可能的话,有谁会如何实现? 最佳答
有些站点位于共享主机(Windows 2003 Server)上,因此我无法访问服务器配置。 我到处都读到关于杠杆浏览器缓存的信息,特别是静态文件(jpg,css,js等)的信息,但是...在我的情况
我想在我的项目中使用 Julia 的主要原因之一是它的速度,尤其是在计算积分方面。 我想在某个区间 [a,b] 上积分一维函数 f(x)。一般来说,Julia 的 quadgk 函数将是一个快速而准确
我是一名优秀的程序员,十分优秀!