commit b5c357a6039d9851d0de69eb83c67a2cea67350b
parent 60558fceaadc3c4e14da859e640b916ad1eff6f3
Author: therealFIGBERT <figbertwelner@gmail.com>
Date: Mon, 2 Dec 2019 13:26:27 -0800
Prepare project for Gaussian algorithm implementation
This commit is the first in a series implementing a dynamic solving system that should allow for systems of equations of any size to be solved accurately.
Diffstat:
3 files changed, 3 insertions(+), 558 deletions(-)
diff --git a/src/components/highLevel/simultaneousEquation.js b/src/components/highLevel/simultaneousEquation.js
@@ -9,423 +9,14 @@ export class SimultaneousEquation extends React.Component {
this.state = {
output: '',
type: 'Two Variables',
- amount: '2',
- wOne: '',
- xOne: '',
- yOne: '',
- zOne: '',
- answerOne: '',
- wTwo: '',
- xTwo: '',
- yTwo: '',
- zTwo: '',
- answerTwo: '',
- wThree: '',
- xThree: '',
- yThree: '',
- zThree: '',
- answerThree: '',
- wFour: '',
- xFour: '',
- yFour: '',
- zFour: '',
- answerFour: ''
+ amount: '2'
};
- this.onClick = this.onClick.bind(this);
- this.onChange = this.onChange.bind(this);
- this.shouldCalculate = this.shouldCalculate.bind(this);
- }
-
- onClick() {
- switch(this.state.type) {
- case "Two Variables":
- this.setState({
- type: 'Three Variables',
- amount: '3'
- });
- break;
- case "Three Variables":
- this.setState({
- type: 'Four Variables',
- amount: '4'
- });
- break;
- default:
- this.setState({
- type: 'Two Variables',
- amount: '2'
- });
- break;
- }
- }
-
- onChange(object) {
- const value = object.target.value,
- name = object.target.name;
- switch (name) {
- case 'wOne':
- this.setState({ wOne: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'xOne':
- this.setState({ xOne: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'yOne':
- this.setState({ yOne: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'zOne':
- this.setState({ zOne: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'answerOne':
- this.setState({ answerOne: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'wTwo':
- this.setState({ wTwo: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'xTwo':
- this.setState({ xTwo: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'yTwo':
- this.setState({ yTwo: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'zTwo':
- this.setState({ zTwo: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'answerTwo':
- this.setState({ answerTwo: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'wThree':
- this.setState({ wThree: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'xThree':
- this.setState({ xThree: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'yThree':
- this.setState({ yThree: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'zThree':
- this.setState({ zThree: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'answerThree':
- this.setState({ answerThree: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'wFour':
- this.setState({ wFour: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'xFour':
- this.setState({ xFour: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'yFour':
- this.setState({ yFour: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'zFour':
- this.setState({ zFour: value }, () => {
- this.shouldCalculate()
- });
- break;
- case 'answerFour':
- this.setState({ answerFour: value }, () => {
- this.shouldCalculate()
- });
- break;
- default:
- this.setState({
- output: 'ERROR'
- });
- }
- }
-
- shouldCalculate() {
- let calc;
- switch (this.state.amount) {
- case '2':
- calc =
- (this.state.xOne !== '' && this.state.yOne !== '' && this.state.answerOne !== '')
- &&
- (this.state.xTwo !== '' && this.state.yTwo !== '' && this.state.answerTwo !== '');
- break;
- case '3':
- calc =
- (this.state.xOne !== '' && this.state.yOne !== '' && this.state.zOne !== '' && this.state.answerOne !== '')
- &&
- (this.state.xTwo !== '' && this.state.yTwo !== '' && this.state.zTwo !== '' && this.state.answerTwo !== '')
- &&
- (this.state.xThree !== '' && this.state.yThree !== '' && this.state.zThree !== '' && this.state.answerThree !== '');
- break;
- case '4':
- calc =
- (this.state.wOne !== '' && this.state.xOne !== '' && this.state.yOne !== '' && this.state.zOne !== '' && this.state.answerOne !== '')
- &&
- (this.state.wTwo !== '' && this.state.xTwo !== '' && this.state.yTwo !== '' && this.state.zTwo !== '' && this.state.answerTwo !== '')
- &&
- (this.state.wThree !== '' && this.state.xThree !== '' && this.state.yThree !== '' && this.state.zThree !== '' && this.state.answerThree !== '')
- &&
- (this.state.wFour !== '' && this.state.xFour !== '' && this.state.yFour !== '' && this.state.zFour !== '' && this.state.answerFour !== '');
- break;
- default:
- this.setState({
- output: 'ERROR'
- });
- }
- if (calc) {
- this.calc()
- }
- }
-
- calc() {
- const lcm = (a, b) => {
- let c = a;
- while (c % b !== 0) {
- c += a;
- }
- return c;
- };
- const invertArray = (array) => {
- for (let i = 0; i < array.length; i++) {
- array[i] = array[i] * -1;
- }
- return array;
- };
-
- const simplify = (amount, eqArray) => {
- if (amount === 2) {
- const a = eqArray[0],
- b = eqArray[1],
- multOne = lcm(a[0], b[0]) / a[0],
- multTwo = lcm(a[0], b[0]) / b[0];
- for (let i = 0; i < b.length; i++) {
- a[i] *= multOne;
- b[i] *= multTwo;
- }
- if (a[0] + b[0] !== 0) {
- invertArray(a);
- }
- for (let i = 0; i < b.length; i++) {
- b[i] += a[i];
- }
- return b;
- } else if (amount === 3) {
- const a = eqArray[0],
- b = eqArray[1],
- c = eqArray[2],
- simpleTwo = simplify(2, [a, b]),
- simpleThree = simplify(2, [a, c]),
- multTwo = lcm(simpleTwo[1], simpleThree[1]) / simpleTwo[1],
- multThree = lcm(simpleTwo[1], simpleThree[1]) / simpleThree[1];
- for (let a = 0; a < simpleThree.length; a++) {
- simpleTwo[a] *= multTwo;
- simpleThree[a] *= multThree;
- }
- if (simpleTwo[1] + simpleThree[1] !== 0) {
- invertArray(simpleTwo);
- }
- for (let a = 0; a < simpleThree.length; a++) {
- simpleThree[a] += simpleTwo[a];
- }
- return [simpleTwo, simpleThree];
- } else if (amount === 4) {
- const a = eqArray[0],
- b = eqArray[1],
- c = eqArray[2],
- d = eqArray[3],
- simpleTwoThree = simplify(3, [a, b, c]),
- simpleFour = simplify(2, [a, d]),
- changingTwo = simpleTwoThree[0],
- changingThree = simpleTwoThree[1],
- multTwo = lcm(changingTwo[1], simpleFour[1]) / changingTwo[1],
- firstMultFour = lcm(changingTwo[1], simpleFour[1]) / simpleFour[1];
- for (let a = 0; a < simpleFour.length; a++) {
- simpleFour[a] *= firstMultFour;
- changingTwo[a] *= multTwo;
- }
- if (simpleFour[1] + changingTwo[1] !== 0) {
- invertArray(changingTwo);
- }
- for (let a = 0; a < simpleFour.length; a++) {
- simpleFour[a] += changingTwo[a];
- }
- const multThree = lcm(changingThree[2], simpleFour[2]) / changingThree[2],
- secondMultFour = lcm(changingThree[2], simpleFour[2]) / simpleFour[2];
- for (let a = 0; a < simpleFour.length; a++) {
- changingThree[a] *= multThree;
- simpleFour[a] *= secondMultFour;
- }
- if (simpleFour[2] + changingThree[2] !== 0) {
- invertArray(changingThree);
- }
- for (let a = 0; a < simpleFour.length; a++) {
- simpleFour[a] += changingThree[a];
- }
- return [simpleTwoThree[0], simpleTwoThree[1], simpleFour];
- }
- };
-
- const answer = (amount, eqArray) => {
- if (amount === 2) {
- const a = eqArray[0],
- b = eqArray[1],
- y = b[2] / b[1],
- x = (a[2] - a[1] * y) / a[0];
- return [x, y];
- } else if (amount === 3) {
- const a = eqArray[0],
- b = eqArray[1],
- c = eqArray[2],
- z = c[3] / c[2],
- y = (b[3] - b[2] * z) / b[1],
- x = (a[3] - (a[2] * z + a[1] * y)) / a[0];
- return [x, y, z];
- } else if (amount === 4) {
- const a = eqArray[0],
- b = eqArray[1],
- c = eqArray[2],
- d = eqArray[3],
- z = d[4] / d[3],
- y = (c[4] - c[3] * z) / c[2],
- x = (b[4] - (b[3] * z + b[2] * y)) / b[1],
- w = (a[4] - (a[3] * z + a[2] * y + a[1] * x)) / a[0];
- return [w, x, y, z];
- }
- };
-
- const dimension = Number(this.state.amount);
- if (dimension === 2) {
- const eqOne = [this.state.xOne, this.state.yOne, this.state.answerOne],
- eqTwo = [this.state.xTwo, this.state.yTwo, this.state.answerTwo],
- simpleY = simplify(2, [eqOne, eqTwo]),
- valuesXY = answer(2, [eqOne, simpleY]);
- this.setState({
- output: 'x = ' + valuesXY[0] + '\ny = ' + valuesXY[1]
- });
- } else if (dimension === 3) {
- const eqOne = [this.state.xOne, this.state.yOne, this.state.zOne, this.state.answerOne],
- eqTwo = [this.state.xTwo, this.state.yTwo, this.state.zTwo, this.state.answerTwo],
- eqThree = [this.state.xThree, this.state.yThree, this.state.zThree, this.state.answerThree],
- simpleYZ = simplify(3, [eqOne, eqTwo, eqThree]),
- valuesXYZ = answer(3, [eqOne, simpleYZ[0], simpleYZ[1]]);
- this.setState({
- output: 'x = ' + valuesXYZ[0] + '\ny = ' + valuesXYZ[1] + '\nz = ' + valuesXYZ[2]
- });
- } else if (dimension === 4) {
- const eqOne = [this.state.wOne, this.state.xOne, this.state.yOne, this.state.zOne, this.state.answerOne],
- eqTwo = [this.state.wTwo, this.state.xTwo, this.state.yTwo, this.state.zTwo, this.state.answerTwo],
- eqThree = [this.state.wThree, this.state.xThree, this.state.yThree, this.state.zThree, this.state.answerThree],
- eqFour = [this.state.wFour, this.state.xFour, this.state.yFour, this.state.zFour, this.state.answerFour],
- simpleXYZ = simplify(4, [eqOne, eqTwo, eqThree, eqFour]),
- valuesXYZ = answer(4, [eqOne, simpleXYZ[0], simpleXYZ[1], simpleXYZ[2]]);
- this.setState({
- output: 'w = ' + valuesXYZ[0] + '\nx = ' + valuesXYZ[1] + '\ny = ' + valuesXYZ[2] + '\nz = ' + valuesXYZ[3]
- });
- } else {
- this.setState({
- output: 'ERROR'
- });
- }
}
render() {
- let buttonValues, displayValues, textValues;
- switch(this.state.type) {
- case "Two Variables":
- buttonValues = [
- 'type',
- ['xOne', 'yOne', 'answerOne'],
- ['xTwo', 'yTwo', 'answerTwo'],
- 'select'
- ];
- displayValues = [this.state.type, '2', '2', '…'];
- textValues = [
- '',
- [this.state.xOne, this.state.yOne, this.state.answerOne],
- [this.state.xTwo, this.state.yTwo, this.state.answerTwo],
- ''
- ];
- break;
- case "Three Variables":
- buttonValues = [
- 'type',
- ['xOne', 'yOne', 'zOne', 'answerOne'],
- ['xTwo', 'yTwo', 'zTwo', 'answerTwo'],
- ['xThree', 'yThree', 'zThree', 'answerThree'],
- 'select'
- ];
- displayValues = [this.state.type, '3', '3', '3', '…'];
- textValues = [
- '',
- [this.state.xOne, this.state.yOne, this.state.zOne, this.state.answerOne],
- [this.state.xTwo, this.state.yTwo, this.state.zTwo, this.state.answerTwo],
- [this.state.xThree, this.state.yThree, this.state.zThree, this.state.answerThree],
- ''
- ];
- break;
- default:
- buttonValues = [
- 'type',
- ['wOne', 'xOne', 'yOne', 'zOne', 'answerOne'],
- ['wTwo', 'xTwo', 'yTwo', 'zTwo', 'answerTwo'],
- ['wThree', 'xThree', 'yThree', 'zThree', 'answerThree'],
- ['wFour', 'xFour', 'yFour', 'zFour', 'answerFour'],
- 'select'
- ];
- displayValues = [this.state.type, '4', '4', '4', '4', '…'];
- textValues = [
- '',
- [this.state.wOne, this.state.xOne, this.state.yOne, this.state.zOne, this.state.answerOne],
- [this.state.wTwo, this.state.xTwo, this.state.yTwo, this.state.zTwo, this.state.answerTwo],
- [this.state.wThree, this.state.xThree, this.state.yThree, this.state.zThree, this.state.answerThree],
- [this.state.wFour, this.state.xFour, this.state.yFour, this.state.zFour, this.state.answerFour],
- ''
- ];
- break;
- }
return (
<div>
<CalcOut mode={this.props.mode} output={this.state.output} />
- <Pad
- type={'large'}
- mode={this.props.mode}
- buttonValues={buttonValues}
- displayValues={displayValues}
- textValues={textValues}
- onClick={this.onClick}
- onChange={this.onChange}
- onModeClick={this.props.onModeChange}
- />
</div>
);
}
diff --git a/src/components/lowLevel/largeButton/index.js b/src/components/lowLevel/largeButton/index.js
@@ -4,8 +4,7 @@ import styles from './styles.module.css';
export class LargeButton extends React.Component {
render() {
- const equationForm = this.props.mode === 'simultaneousEQ',
- canBeDisabled = this.props.mode === 'angSize',
+ const canBeDisabled = this.props.mode === 'angSize',
acceptsInput = this.props.mode !== 'select';
if (this.props.value === 'select') {
return (
@@ -30,123 +29,7 @@ export class LargeButton extends React.Component {
</button>
);
}
- if (equationForm) {
- if (this.props.displayValue === '2') {
- return (
- <div className={styles.EQButton}>
- <span className={styles.closeText}>
- <input
- type='number'
- name={this.props.value[0]}
- value={this.props.textValue[0]}
- onChange={this.props.onChange}
- />
- x
- </span> +
- <span className={styles.closeText}>
- <input
- type='number'
- name={this.props.value[1]}
- value={this.props.textValue[1]}
- onChange={this.props.onChange}
- />
- y
- </span> =
- <input
- type='number'
- name={this.props.value[2]}
- value={this.props.textValue[2]}
- onChange={this.props.onChange}
- />
- </div>
- );
- } else if (this.props.displayValue === '3') {
- return (
- <div className={styles.EQButton}>
- <span className={styles.closeText}>
- <input
- type='number'
- name={this.props.value[0]}
- value={this.props.textValue[0]}
- onChange={this.props.onChange}
- />
- x
- </span> +
- <span className={styles.closeText}>
- <input
- type='number'
- name={this.props.value[1]}
- value={this.props.textValue[1]}
- onChange={this.props.onChange}
- />
- y
- </span> +
- <span className={styles.closeText}>
- <input
- type='number'
- name={this.props.value[2]}
- value={this.props.textValue[2]}
- onChange={this.props.onChange}
- />
- z
- </span> =
- <input
- type='number'
- name={this.props.value[3]}
- value={this.props.textValue[3]}
- onChange={this.props.onChange}
- />
- </div>
- );
- } else if (this.props.displayValue === '4') {
- return (
- <div className={styles.EQButton}>
- <span className={styles.closeText}>
- <input
- type='number'
- name={this.props.value[0]}
- value={this.props.textValue[0]}
- onChange={this.props.onChange}
- />
- w
- </span> +
- <span className={styles.closeText}>
- <input
- type='number'
- name={this.props.value[1]}
- value={this.props.textValue[1]}
- onChange={this.props.onChange}
- />
- x
- </span> +
- <span className={styles.closeText}>
- <input
- type='number'
- name={this.props.value[2]}
- value={this.props.textValue[2]}
- onChange={this.props.onChange}
- />
- y
- </span> +
- <span className={styles.closeText}>
- <input
- type='number'
- name={this.props.value[3]}
- value={this.props.textValue[3]}
- onChange={this.props.onChange}
- />
- z
- </span> =
- <input
- type='number'
- name={this.props.value[4]}
- value={this.props.textValue[4]}
- onChange={this.props.onChange}
- />
- </div>
- );
- }
- } else if (canBeDisabled) {
+ if (canBeDisabled) {
if (!this.props.disabledTruth) {
return (
<button className={styles.disabled} value={this.props.value} onClick={this.props.onClick}>
diff --git a/src/components/lowLevel/largeButton/styles.module.css b/src/components/lowLevel/largeButton/styles.module.css
@@ -43,33 +43,4 @@ input {
flex-direction: column;
justify-content: space-evenly;
align-items: center;
-}
-
-.EQButton {
- background: #ac1a2d;
- color: rgba(255, 255, 255, .7);
- font-family: Tomorrow, -apple-system, sans-serif;
- width: 30vmax;
- height: 5vmax;
- margin-top: 1vmax;
- margin-left: 1vmax;
- margin-right: 1vmax;
- font-size: 2vmax;
- text-align: center;
- border-radius: 1vmax;
- display: flex;
- flex-direction: row;
- justify-content: space-evenly;
- align-items: center;
-}
-
-.EQButton input {
- width: 2vmax;
-}
-
-.closeText {
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: center;
}
\ No newline at end of file