어떻게 vue 를 이용 하여 스펙트럼 적합 을 실현 합 니까?
소 백 이 가 직장 에 처음 들 어 왔 을 때 첫 번 째 정 리 는 쓸데없는 말 이 많 으 니 가볍게 뿌 려 주세요~
스펙트럼 의합 은 특정한 재료 나 물질의 스펙트럼 을 식별 하고 분석 하 는 데 사용 된다.각 물질 은 여러 가지 성분 이 있 을 수 있 고 각 성분 은 component 1,component 2 로 표시 한다.Add another component 와 Remove component 로 각 성분 의 증가 와 삭 제 를 제어 하고 각 성분 은 여러 가지 원자핵 으로 구성 된다.즉,nuclei 는 Add nucleus 와 Remove 를 사용한다. nucleus 는 각 성분 내 원자핵 의 수량 을 통제 하고 하나의 원자핵 을 추가 할 때마다 스펙트럼 은 한 번 씩 분열 되 며 스펙트럼 수량 은(1->2->4->8...)순서대로 분열 된다.또한 기본 매개 변 수 를 변경 하여 스펙트럼 형 태 를 바 꿀 수 있 습 니 다.성분 매개 변 수 는 Relative amount 는 각 성분 이 그림 분량 의 백분율 을 차지 하고 백분율 의 합 이 100 을 초과 하지 않 음 을 나타 내 며 giso 는 분 단 된 중심 위 치 를 계산 하 는 데 사 용 됩 니 다.LineWidth 는 보 봉 에서 보 곡 까지 의 폭 을 제어 하고%Lorentzian 은 보 봉 형 태 를 나타 내 며 모두 두 가지 형태 입 니 다.고 스 와 로 렌 츠.둘 의 합 은 100 이다.원자핵 매개 변수:No of equivalent nuclei 는 원자핵 개 수 를 바 꾸 는 데 사 용 됩 니 다.한 성분 에 똑 같은 매개 변수 가 많이 포함 되 어 있 을 때 이 매개 변 수 를 바 꾸 어 실현 할 수 있 습 니 다.Nuclear spin 은 원자핵 종 류 를 바 꾸 는 데 사 용 됩 니 다.Hyperfine 은 분 단 된 두 봉 사이 의 폭 을 설정 합 니 다.
그림 한 장 더 보기:
각 성분 의 수량 과 매개 변수,각 성분 내 각 원자핵 의 수량 과 매개 변 수 를 설정 한 후 데 이 터 를 처리 하고 세 가지 결과,볼 륨,포인트,이중 포인트 로 데이터 의 처리 논 리 를 살 펴 보 자~
데이터 흐름 의 측면 에서 주로 세 단계 처 리 를 한다.데이터->데이터 분열->스펙트럼 계산->그림 그리 기,왼쪽 은 알고리즘 실현 에 필요 한 매개 변수,오른쪽 은 데이터 와 모든 절차 에 대한 설명 이다.
코드 구현
구 덩이 를 만 났 습 니 다.처음에 demo 를 쓸 때 사용 하 는 vue+Ant design of vue 는 select 등 다른 구성 요소 의 사용 에 있어 서 정상 적 이지 만 input number 에서 변태 적 입 니 다.input number 에 연 결 된 change 사건 은 사용자 가 두 자리 이상 의 데 이 터 를 입력 할 때 change 사건 이 두 번 발생 합 니 다!!이 문 제 를 피 하려 면 blur 이벤트 로 문제 가 다시 발생 했 습 니 다.이 페이지 에서 구성 요소 의 생 성과 삭 제 는 동적 렌 더 링 이 필요 하기 때 문 입 니 다.또한 앞의 소개 에 따 르 면 구성 요소 의 렌 더 링 이 2 층 구조 라 는 것 을 쉽게 알 수 있 습 니 다.그러면 사용자 가 클릭 하거나 입력 할 때...하나의 매개 변 수 를 전달 해 야 합 니 다.(어떤 component 인지,그리고 모든 component 아래 에 대응 하 는 nucle 등)능력 에 한계 가 있 습 니 다.(s□t)현재 해결 방법 을 찾 지 못 해서 element UI 프레임 워 크 를 돌 립 니 다.
구성 요소 의 동적 렌 더 링 은 비교적 교묘 한 방법 을 사 용 했 습 니 다.처음에 저 는 render 로 쓰 려 고 했 습 니 다.나중에 부서 의 신 에 게 서 목록 을 옮 겨 다 니 며 렌 더 링 하 는 것 을 배 웠 습 니 다.머 릿 속 에 차이 가 있 습 니 다.
<div v-for="(Con, i) in componentList" :key="Con[i]"><strong>Component {{i+1}}.</div>
동 리 원자핵 의 동적 렌 더 링 도 이렇게 실현 된다.
<div v-for="(li, j) in nucleusList[i]" :key="li[j]">{{j+1}}. No of equivalent nuclei:</div>
그리고 매번 배열 목록 의 길 이 를 늘 리 고 삭제 할 때마다 조작 하면 됩 니 다~각 매개 변수의 바 인 딩:component 에서 매개 변 수 는 모두 1 차원 배열 을 사용 합 니 다.chenge 사건 은 1 차원 배열 의 하 표를 전달 해 야 합 니 다.component 안의 nucleui 는 모두 2 차원 배열 을 사용 하고 change 사건 은 2 차원 배열 의 하 표를 전달 해 야 합 니 다.
상기 매개 변수 정 의 를 소개 합 니 다.다음은 데이터 처리 입 니 다.
//
stickspectrum (w) {
// console.log(' ', w)
const stick = new Array(2) // stick[0] stick ,stick[1]
stick[0] = new Array()//
stick[1] = new Array()//
stick[1][0] = this.h * this.frequency / (this.r[w].g * this.mu)
for (var j = 0; j < this.r[w].equiv.length; j++) {
// console.log('stick[0].length', stick[0].length) //
for (var i = stick[0].length - 1; i >= 0; i--) {
stick[0][i] /= Math.pow((2 * this.r[w].spin[j] + 1), this.r[w].equiv[j])
stick[1][i] -= this.r[w].equiv[j] * this.r[w].spin[j] * this.r[w].hfc[j]
for (var k = 0; k < 2 * this.r[w].equiv[j] * this.r[w].spin[j]; k++) {
stick[1].splice(i + k + 1, 0, stick[1][i] + this.r[w].hfc[j] * (k + 1))
stick[0].splice(i + k + 1, 0, 0)
}
for (var k = 0; k < this.r[w].equiv[j]; k++) {
for (var m = i + 2 * this.r[w].spin[j] * k; m >= i; m--) {
for (var ii = 0; ii < 2 * this.r[w].spin[j]; ii++) {
stick[0][m + ii + 1] += stick[0][m]
}
}
}
}
}
return stick
},
//
spectrum (stick) {
let xmin = Infinity; let xmax = 0
for (var k = 0; k < this.r.length; k++) {
xmin = Math.min(Math.min.apply(Math, stick[k][1]) - 10 * this.r[k].width, xmin)
xmax = Math.max(Math.max.apply(Math, stick[k][1]) + 10 * this.r[k].width, xmax)
}
const tmp = xmax - xmin
xmax += tmp * 0.05
xmin -= tmp * 0.05
const step = (xmax - xmin) / (this.No_integers - 1)
for (let i = 0; i < this.No_integers; i++) {
this.XY[0][i][0] = xmin + step * i
this.XY[0][i][1] = 0
this.XYint[0][i][0] = this.XY[0][i][0]
this.XYint[0][i][1] = 0
this.XYdoubleint[0][i][0] = this.XY[0][i][0]
this.XYdoubleint[0][i][1] = 0
}
for (let k = 0; k < this.r.length; k++) { //
const sticks = new Array(this.No_integers)
for (var i = 0; i < stick[k][0].length; i++) {
var j = Math.round((stick[k][1][i] - xmin) / step)
sticks[j] = sticks[j] ? sticks[j] + stick[k][0][i] : stick[k][0][i]
}
const tmp = new Array(this.No_integers)//
let ind = 0
for (var i = 0; i < this.No_integers; i++) {
if (sticks[i]) { // ――sticks[i]===1 。
tmp[ind] = i
ind++
}
}
const tmpint = new Array(this.No_integers) //
const tmpdoubleint = new Array(this.No_integers) //
for (var i = 0; i < this.No_integers; i++) tmpint[i] = 0
tmpdoubleint[0] = 0
const rwid = Number(this.r[k].width)
const rwid2 = Math.pow(rwid, 2)
const lortmp = Number(this.r[k].percent) * Number(this.r[k].lor) / 100 * Math.sqrt(3) / Math.PI //
const gaustmp = Number(this.r[k].percent) * (100 - Number(this.r[k].lor)) / 100 * Math.sqrt(2 / Math.PI) //
for (let i = 0; i < this.No_integers; i++) {
for (let j = 0; j < ind; j++) {
const delta = this.XY[0][i][0] - this.XY[0][tmp[j]][0]
const delta2 = Math.pow(delta, 2)
if ((rwid > step && Math.abs(-0.5 * rwid - delta) < 0.5 * step) || (rwid < step && -0.5 * rwid - delta > 0 && -0.5 * rwid - delta < step)) {
this.XY[0][i][1] += sticks[tmp[j]] * (lortmp * 0.5 / rwid2 + gaustmp * 2 / Math.sqrt(Math.E) / rwid2)
} else if ((rwid > step && Math.abs(0.5 * rwid - delta) < 0.5 * step) || (rwid < step && delta - 0.5 * rwid > 0 && delta - 0.5 * rwid < step)) {
this.XY[0][i][1] -= sticks[tmp[j]] * (lortmp * 0.5 / rwid2 + gaustmp * 2 / Math.sqrt(Math.E) / rwid2)
} else {
this.XY[0][i][1] += sticks[tmp[j]] * (gaustmp * (-4) / rwid / rwid2 * delta * Math.exp(-2 * delta2 / rwid2) + lortmp * (-delta) * rwid / Math.pow((delta2 + 3 / 4 * rwid2), 2)) // , +
}
this.dataarray = [this.XY, this.XYint, this.XYdoubleint]
tmpint[i] += sticks[tmp[j]] * (gaustmp * Math.exp(-2 * delta2 / rwid2) / rwid + lortmp / 2 / rwid / (0.75 + delta2 / rwid2)) // + -
}
}
for (let j = 1; j < this.No_integers; j++) {
tmpdoubleint[j] = tmpdoubleint[j - 1] + step * (tmpint[j] + tmpint[j - 1]) / 2
} //
// console.log(' ', tmpdoubleint)
const mm = tmpdoubleint[this.No_integers - 1] / Number(this.r[k].percent) // ( )
for (let j = 1; j < this.No_integers; j++) {
this.XYdoubleint[0][j][1] += mm > 1 ? tmpdoubleint[j] / mm : tmpdoubleint[j] // ,
this.XYint[0][j][1] += tmpint[j] //
}
}
// console.log('XYint', this.XYint[0])
},
완 성 된 스펙트럼 을 계산 하여 세 가지 데이터 XY,XYint,XYdouble 을 되 돌려 주 고 그림 을 그립 니 다~vue 를 이용 하여 스펙트럼 적합 을 어떻게 실현 하 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 vue 가 스펙트럼 적합 을 실현 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fastapi websocket 및 vue 3(Composition API)1부: FastAPI virtualenv 만들기(선택 사항) FastAPI 및 필요한 모든 것을 다음과 같이 설치하십시오. 생성main.py 파일 및 실행 - 브라우저에서 이 링크 열기http://127.0.0.1:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.