Skip to content

Commit 044afd7

Browse files
committed
参数方程面板
1 parent f4ca35e commit 044afd7

File tree

3 files changed

+67
-15
lines changed

3 files changed

+67
-15
lines changed

src/editor/inputs/parametric.vue

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,38 @@
88
<span class="label styled">y=</span>
99
<FilledTextfield class="styled fn" label="g(t)" v-model="self.y" />
1010
</div>
11-
11+
<AnimatedFold :folded="props.folded">
12+
<s-divider>{{ t("data.more.dividerTitle") }}</s-divider>
13+
<div class="input-inner-optional">
14+
<div class="fields">
15+
<!-- range -->
16+
<span class="label"> {{ t("data.more.range") }} </span>
17+
<Domain :self="self" :defaultMin="0" :defaultMax="2 * Math.PI" />
18+
<!-- color -->
19+
<span class="label">
20+
{{ t("data.more.color") }}
21+
<HelpIcon> {{ t("data.more.colorHelp") }} </HelpIcon>
22+
</span>
23+
<ColorPicker v-model="self.color" />
24+
<!-- nSamples -->
25+
<span class="label"> {{ t("data.more.nSamples") }} </span>
26+
<s-text-field
27+
class="input monospace-inner"
28+
type="number"
29+
:label="t('data.more.nSamples')"
30+
v-model="self.nSamples"
31+
:min="1"
32+
@blur="if (!self.nSamples) self.nSamples = undefined;"
33+
></s-text-field>
34+
</div>
35+
<div class="switches">
36+
<!-- closed -->
37+
<s-checkbox type="checkbox" v-model.lazy="self.closed">
38+
{{ t("data.more.closed") }}
39+
</s-checkbox>
40+
</div>
41+
</div>
42+
</AnimatedFold>
1243
</div>
1344
</template>
1445

@@ -20,6 +51,10 @@ import { I18nSchema } from "@/i18n";
2051
const { t } = useI18n<{ message: I18nSchema }>();
2152
2253
import FilledTextfield from "@/editor/inputs/subblocks/function.vue";
54+
import HelpIcon from "./subblocks/helpIcon.vue";
55+
import ColorPicker from "./subblocks/colorPicker.vue";
56+
import Domain from "./subblocks/domain.vue";
57+
import AnimatedFold from "@/ui/animated/animatedFold.vue";
2358
2459
const props = defineProps<{
2560
folded: boolean;

src/editor/inputs/subblocks/domain.vue

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,28 @@ const { t } = useI18n<{ message: I18nSchema }>();
2222
2323
import { PrivateDataTypes } from "@/types/data";
2424
import { ref, watch } from "vue";
25-
const props = defineProps<{ self: PrivateDataTypes.Functions }>();
26-
const infToUndefined = (value: number) =>
27-
value === Infinity || value === -Infinity ? "" : value;
28-
const undefinedToInf = (value: number | "" | undefined, sign: number) =>
29-
value === "" || value === undefined ? sign * Infinity : value;
30-
const value1 = ref<number | "">(infToUndefined(props.self.range[0]));
31-
const value2 = ref<number | "">(infToUndefined(props.self.range[1]));
25+
const props = defineProps<{
26+
self:
27+
| PrivateDataTypes.Linear
28+
| PrivateDataTypes.Parametric
29+
| PrivateDataTypes.Polar;
30+
defaultMin?: number;
31+
defaultMax?: number;
32+
}>();
33+
const [defaultMin, defaultMax] =
34+
PrivateDataTypes.defaultRange[props.self.fnType];
35+
const defToUndefined = (value: number) =>
36+
value === defaultMin || value === defaultMax ? "" : value;
37+
const undefinedToDef = (value: number | "" | undefined, defValue: number) =>
38+
value === "" || value === undefined ? defValue : value;
39+
const value1 = ref<number | "">(defToUndefined(props.self.range[0]));
40+
const value2 = ref<number | "">(defToUndefined(props.self.range[1]));
3241
3342
watch(value1, (newVal) => {
34-
props.self.range[0] = undefinedToInf(newVal, -1);
43+
props.self.range[0] = undefinedToDef(newVal, defaultMin);
3544
});
3645
watch(value2, (newVal) => {
37-
props.self.range[1] = undefinedToInf(newVal, 1);
46+
props.self.range[1] = undefinedToDef(newVal, defaultMax);
3847
});
3948
</script>
4049

src/types/data.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ export namespace PrivateDataTypes {
3636
};
3737
}
3838

39+
export const defaultRange = {
40+
linear: [-Infinity, Infinity],
41+
parametric: [0, 2 * Math.PI],
42+
polar: [-Math.PI, Math.PI],
43+
} as const;
44+
3945
/** Normal functions: y=f(x) */
4046
export type Linear = Function & {
4147
fnType: "linear";
@@ -133,8 +139,10 @@ export function toPublicData(data: PrivateData): FunctionPlotDatum {
133139
...data,
134140
range: ((): [number, number] | undefined => {
135141
if (!("range" in data)) return undefined;
136-
let [v1, v2] = data.range;
137-
if (v1 === -Infinity && v2 === Infinity) return undefined;
142+
let [min, max] = data.range;
143+
let [defaultMin, defaultMax] =
144+
PrivateDataTypes.defaultRange[data.fnType];
145+
if (min === defaultMin && max === defaultMax) return undefined;
138146
return data.range;
139147
})(),
140148
derivative: (() => {
@@ -222,7 +230,7 @@ export function toPrivateData(input: Object) {
222230
}),
223231
skipTip: false,
224232
nSamples: undefined,
225-
range: () => [-Infinity, Infinity] as [number, number],
233+
range: () => [...PrivateDataTypes.defaultRange.linear],
226234
...getFunctionGlobals(),
227235
}
228236
);
@@ -239,7 +247,7 @@ export function toPrivateData(input: Object) {
239247
graphType: "polyline",
240248
r: "",
241249
nSamples: undefined,
242-
range: () => [-Infinity, Infinity] as [number, number],
250+
range: () => [...PrivateDataTypes.defaultRange.polar],
243251
...getFunctionGlobals(),
244252
});
245253
case "parametric":
@@ -249,7 +257,7 @@ export function toPrivateData(input: Object) {
249257
x: "",
250258
y: "",
251259
nSamples: undefined,
252-
range: () => [-Infinity, Infinity] as [number, number],
260+
range: () => [...PrivateDataTypes.defaultRange.parametric],
253261
...getFunctionGlobals(),
254262
});
255263
case "points":

0 commit comments

Comments
 (0)