삼각파를 발생시키는 단선 함수가 있나요?
모듈로가 톱니 파동을 일으키는 것과 비슷한 방식으로요.연속적일 필요는 없습니다.
내 말은 이렇다.
int m = 10;
int x = 0;
int i = 0;
while (i < m*3) {
printf("%d ", x);
x++;
x = x % m;
i++;
}
는 다음과 같은 시퀀스0.9를 3회 생성합니다.
봉우리 오른쪽에 있는 경사는 단지 그래프로 나타낸 유물에 불과하다는 점에 유의하십시오.
이 경우 1라인은 x = i++ % m입니다.
내가 원하는 건 이거야
다른 웨이브 형태(사인, 정사각형)에 대한 한 줄도 알고 있다면 알아두면 좋을 것입니다.
업데이트: 여러분의 답변이 매우 도움이 되었습니다.팔로우업 질문이 있습니다.
선의 기울기를 다음과 같이 곡선으로 만들거나 곡선을 그리려면 삼각파 함수에 무엇이 추가됩니까?
여러분, 감사합니다.여러분의 다양한 답변이 제가 문제를 더 큰 시각으로 볼 수 있도록 도와주었습니다.2차 곡선으로 방정식을 확장해준 놀도린에게 특별한 감사를 표합니다.
삼각파
y = abs((x++ % 6) - 3);
이렇게 하면 3과 0 사이에서 진동하는 주기 6의 삼각형 파형이 생성됩니다.
사각파
y = (x++ % 6) < 3 ? 3 : 0;
이렇게 하면 3과 0 사이에서 진동하는 주기 6의 규칙적인 사각파가 생성됩니다.
사인파
y = 3 * sin((float)x / 10);
가 생깁니다.20 pi
3 사이에서
업데이트:
곡선 삼각파
직선이 아닌 곡선이 있는 삼각파의 변동을 얻으려면 방정식에 지수를 도입하여 2차 방정식으로 만들어야 합니다.
곡선 오목 곡선:x^2
★★★★
y = pow(abs((x++ % 6) - 3), 2.0);
곡선 오목 곡선:sqrt(x)
★★★★
y = pow(abs((x++ % 6) - 3), 0.5);
" " 를 하는 방법pow
함수는 단순히 '아, 아, 아, 아, 아, 아, 아, 아, 아이다'를 정의할 수 있습니다.square
를 합니다.sqrt
math.h
이치노
또한 곡선을 더 가파르게/수평하게 만들려면 인덱스를 변경해 보십시오.
이러한 경우 모두 주어진 파형의 변동(다른 주기, 증폭, 비대칭 등)을 제공하기 위해 상수를 쉽게 조정하고 적절한 위치에 스케일링 계수를 추가할 수 있습니다.
Eric Bainville의 답변에 대해 자세히 설명하겠습니다.
y = (A/P) * (P - abs(x % (2*P) - P) )
여기서 x는 실행 중인 정수이고 y는 삼각파 출력입니다.A는 파형의 진폭이고 P는 반주기입니다.예를 들어 A=5는 0에서 5까지의 파동을 생성하고 P=10은 20주기의 파동을 생성합니다.파형은 x=0인 경우 y=0에서 시작합니다.
P가 A의 계수가 아닌 한 y는 부동소수점이 됩니다.그리고, 네, 수학적 순수주의자들을 위해:A는 엄밀히 말하면 파형의 두 배이지만, 아래 그림을 보면 무슨 뜻인지 알 수 있을 것입니다.
가시화:
x = m - abs(i % (2*m) - m)
오래된 게시물인 것은 알지만 비슷한 것을 찾고 있는 사람에게는 추천한다.http://en.wikipedia.org/wiki/Triangle_wave
마지막 공식 y(x)=(2a/solid) arcsin(sin((2cs/p)*x))
또는.
(2 * amplitudeConstant / Math.PI) * Math.Asin(Math.Sin(2 * (Math.PI / periodConstant) * Convert.ToDouble(variableX)))
y = abs( amplitude - x % (2*amplitude) )
파장 변경은 다음 요소만 있으면 됩니다.x
.
편집: 진폭이라고 하는 것은 실제로 진폭이 아니라 최대값(곡선이 0과 5를 진동하는 경우 5)입니다.수학적인 의미에서의 진폭은 그것의 절반이다.하지만 요점은 아시잖아요
이것을 시험해 보세요.
x = m - abs(m - 2*(i++ % m))
다음은 원거리 사인 근사처럼 보이는 주기 함수입니다. 기본적으로 X 제곱을 사용하는 시닝 포물선입니다.
function xs ( xx : float ): float{
var xd =Mathf.Abs((Mathf.Abs(xx) % 2.4) - 1.2);
if ( Mathf.Abs(Mathf.Abs(xx) % 4.8) > 2.4){
xd=(-xd*xd)+2.88;
}else{
xd = xd*xd;
}
return xd;
}
간단한 루프로 시험해 봤는데 당신들은 그 남자의 질문에 전혀 대답하지 않았어요.오려 붙이는 것은 사람들에게 도움이 되지 않는다.그렇게 많은 대중매체의 속임수가 그렇게 많은 성공을 거둔 것은 당연하다.다른 사람의 실수를 반복하는 사람들과 함께라면 놀랄 일도 아니다.그리고 사람들은 이런 오답에 대해 긍정적인 평판을 주기도 하나요?믿겨지지 않는다!하지만 다시 말하지만, 이것은 내가 전에 말한 것과 유사하다.
먼저 삼각파가 무엇인지에 대해 설명하겠습니다.두 개의 동일한 경사 경사로로 구성된 주기가 있는 파도입니다.첫 번째와 동일하게 경사가 UP, 경사가 DOWN인 SAWTOH와 반대로 경사가 DOWN인 램프는 역탈루드 후에 반복된다.
PS: 마지막으로 "y(x)=(2a/sin)arcsin(sin((2cs/p)*x)"을 준 사람은 너무 복잡해서 우리는 빠른 c++ 루틴을 찾고 있기 때문에 삼각법은 절대 불가능하다.
테스트 루틴:
(...)
for (byte V=0; V<255; V++)
{
unsigned int x = evenramp(V);
plotRGB(0,0,x,x,x);
delay(100); // make sure you have your own delay function declared of course
/* use your own graphic function !!! plotRGB(row,column,R,G,B) */
/* the light intensity will give you the change of value V in time */
/* all functions suggested as answer give SAWTOOTH and NOT TRIANGLE */
/* it is a TRIANGLE the man wants */
}
float triangleattempt(unsigned int x) // place any answered formula after '255 *' behind return.
{
return 255 * (255 - abs(255 - 2*(x % 255))); // this will show a SAWTOOTH
}
//All given answers up to now excluding "function xs ( xx : float ): float" (this is not the requested one-liner, sorry) that are not a symmetrical triangle wave
// m - abs(i % (2*m) - m); (this is still a SAWTOOTH wave and not a TRIANGLE wave)
// abs((x++ % 6) - 3); (this is still a SAWTOOTH wave and not a TRIANGLE wave)
// abs(amplitude - x % (2*amplitude)); (this is still a SAWTOOTH wave and not a TRIANGLE wave)
=> 수학표기로 정답을 정확하게 알 수 있는 소스를 찾았습니다.
KmPlot이라는 리눅스 프로그램에서 공식을 테스트했습니다.Linux 사용자는 루트 터미널에서 apt-get install kmplot을 입력하여 kmplot을 얻을 수 있으며, 이것이 작동하지 않으면 일반 터미널을 사용하여 sudo apt-get install kmplot을 입력해 보십시오.이렇게 하면 Linux 프로그램 설치에 대한 일반적인 지침은 이 유튜브 비디오를 참조하십시오.http://www.youtube.com/watch?v=IkhcwxC0oUg
따라서 스레드 질문에 대한 정답은 다음과 같은 c++ 형식의 대칭 삼각형 함수 선언의 예입니다.
(...)
int symetrictriangle(float x)
{
unsigned int period = 30; // number of increases of x before a new cycle begins
unsigned int amplitude = 100; // top to bottom value while the bottom value is always zero
return amplitude * 2 * abs(round(x/period)-(x/period));
}
(...)
치어리더!
언급URL : https://stackoverflow.com/questions/1073606/is-there-a-one-line-function-that-generates-a-triangle-wave
'source' 카테고리의 다른 글
uint8_t는 언제 부호 없는 문자입니까? (0) | 2022.08.27 |
---|---|
Eclipse의 기존 소스에서 프로젝트를 만든 후 찾는 방법은 무엇입니까? (0) | 2022.08.27 |
C : typedef 구조명 {...}; VS typedef 구조{...} 이름 (0) | 2022.08.27 |
확장 C 매크로 표시 (0) | 2022.08.27 |
restrict 키워드는 gcc/g++에 큰 이점이 있습니까? (0) | 2022.08.27 |