diff --git a/main.js b/main.js index a47441f..5891b32 100644 --- a/main.js +++ b/main.js @@ -22,52 +22,30 @@ class Resistor { return `${'--'.repeat(depth)}${this.toString()}` } parallel(other) { - return NewParallelResistor.smart(this, other); + return new ParallelResistor(this, other); } series(other) { - return NewSeriesResistor.smart(this, other); + return new SeriesResistor(this, other); } -} -class ComplexResistor extends Resistor { - left; - constructor(other) { - super(other.getOhmage()); - this.left = other; + getSVG() { + var svg = ` + ${this.getOhmage()}Ω` + var [width, height] = [50, 100] + return [svg, width, height] } -} -class SeriesResistor extends Resistor { - left; - right; - constructor(r1, r2) { - super(r1.getOhmage() + r2.getOhmage()); - this.left = r1; - this.right = r2; - } - size() { - return this.left.size() + this.right.size(); - } - prettyString(depth = 0) { - var leftString = this.left.prettyString(depth + 1) - var leftString = this.left.constructor.name === "SeriesResistor" ? `${this.left.left.prettyString(depth + 1)}\n${this.left.right.prettyString(depth + 1)}` : this.left.prettyString(depth + 1); - var rightString = this.right.constructor.name === "SeriesResistor" ? `${this.right.left.prettyString(depth + 1)}\n${this.right.right.prettyString(depth + 1)}` : this.right.prettyString(depth + 1); - return `${'--'.repeat(depth)}${this.toString()}\n${leftString}\n${rightString}`; - } -} -class ParallelResistor extends Resistor { - left - right - constructor(r1, r2) { - super(1 / ((1/r1.getOhmage()) + (1/r2.getOhmage()))); - this.left = r1; - this.right = r2; - } - size() { - return this.left.size() + this.right.size(); - } - prettyString(depth = 0) { - return `${'--'.repeat(depth)}${this.toString()} -${this.left.prettyString(depth + 1)} -${this.right.prettyString(depth + 1)}` + draw() { + var [svg, width, height] = this.getSVG(); + var maxHeight = height + 2*25 + var maxWidth = width + var midPoint = width / 2 + var thesvg = ` + + + + ${svg} + + ` + document.getElementsByTagName("body")[0].innerHTML = thesvg; } } @@ -81,49 +59,18 @@ function harm(list) { list.forEach(e => temp += 1 / e); return 1 / temp; } +function flatten(list, flattable) { + return list.reduce( (acc, cur) => acc.concat(cur.constructor.name === flattable ? cur.children : [cur]), []); +} + class NestedResistor extends Resistor { children = [] - constructor(l, func) { + constructor(l, func, instance) { super(func(l.map(e => e.getOhmage()))); this.func = func - this.children = l; - } - cost() { - return func(this.children.map(e => e.cost())); - } - prettyString(depth = 0) { - var childrenStrings = this.children.map(c => c.prettyString(depth + 1)).join("\n") - return `${'--'.repeat(depth)}${this.toString()}\n${childrenStrings}` - } - parallel(other) { - return NewParallelResistor.smart(this, other); - } - series(other) { - return NewSeriesResistor.smart(this, other); - } -} -} - - -class NewSeriesResistor extends Resistor { - children = [] - - static smart(...list) { - var thelist = [] - list.forEach(e => { - if (e.constructor.name === "NewSeriesResistor") { - e.children.forEach(e => thelist.push(e)); - } else { - thelist.push(e); - } - }); - return new NewSeriesResistor(thelist); - } - constructor(l) { - super(sum(l.map(e => e.getOhmage()))); - this.children = l; + this.children = flatten(l, instance.constructor.name); } cost() { return sum(this.children.map(e => e.cost())); @@ -133,49 +80,83 @@ class NewSeriesResistor extends Resistor { return `${'--'.repeat(depth)}${this.toString()}\n${childrenStrings}` } parallel(other) { - return NewParallelResistor.smart(this, other); + return new ParallelResistor(this, other); } series(other) { - return NewSeriesResistor.smart(this, other); + return new SeriesResistor(this, other); } } -class NewParallelResistor extends Resistor { - children = [] - - static smart(...list) { - var thelist = [] - list.forEach(e => { - if (e.constructor.name === "NewParallelResistor") { - e.children.forEach(e => thelist.push(e)); - } else { - thelist.push(e); - } +class SeriesResistor extends NestedResistor { + constructor(...l) { + super(l, sum, "SeriesResistor"); + } + getSVG() { + var svgs = this.children.map(e => e.getSVG()); // triplets [svg, width, height] + var n = svgs.length; + var maxHeight = sum(svgs.map(([svg, width, height]) => height)) + 25 * (n - 1) + var maxWidth = Math.max(...svgs.map(([svg, width, height]) => width)) + var yOffset = 0; // where to start the next boundin + var centerLine = maxWidth / 2; + + var innerSVGs = [] + var i = 0; + svgs.forEach(([svg, width, height]) => { + var xStart = (maxWidth - width) / 2 + + var partialInnerSVG = `${svg}` + if (i < n - 1) + partialInnerSVG += `` + // finally + yOffset += 25 + height + i ++; + innerSVGs.push(partialInnerSVG) }); - return new NewParallelResistor(thelist); + var svg = innerSVGs.join("") + return [svg, maxWidth, maxHeight] } - constructor(l) { - super(harm(l.map(e => e.getOhmage()))); - this.children = l; +} + +class ParallelResistor extends NestedResistor { + constructor(...l) { + super(l, harm, "ParallelResistor"); } - cost() { - return sum(this.children.map(e => e.cost())); - } - prettyString(depth = 0) { - var childrenStrings = this.children.map(c => c.prettyString(depth + 1)).join("\n") - return `${'--'.repeat(depth)}${this.toString()}\n${childrenStrings}` - } - parallel(other) { - return NewParallelResistor.smart(this, other); - } - series(other) { - return NewSeriesResistor.smart(this, other); + getSVG() { + var svgs = this.children.map(e => e.getSVG()); // triplets [svg, width, height] + var n = svgs.length; + var maxHeight = Math.max(...svgs.map(([svg, width, height]) => height)) + 2 * 25 + var maxWidth = sum(svgs.map(([svg, width, height]) => width)) + 25 * (n - 1) + var bottomLineStart = svgs[0][1] / 2 + var bottomLineEnd = maxWidth - svgs[n - 1][1] / 2 + var xOffset = 0; // where to start the next boundin + + var innerSVGs = [] + svgs.forEach(([svg, width, height]) => { + var antennaX = xOffset + width / 2 + var antennaLength = (maxHeight - height) / 2 + var antennaOneStart = 0 + var antennaOneEnd = antennaLength + var antennaTwoStart = antennaLength + height + var antennaTwoEnd = maxHeight + + var partialInnerSVG = `${svg} + + ` + // finally + xOffset += 25 + width + innerSVGs.push(partialInnerSVG) + }); + var innerSVG = innerSVGs.join("") + var svg = ` + + ${innerSVG}` + return [svg, maxWidth, maxHeight] } } -var resistors = [100] +var resistors = [100, 1000] var N = 4 var maxValue = Math.max(...resistors) @@ -202,8 +183,8 @@ function iterSet() { addition = new Set() set.forEach(e1 => { set.forEach(e2 => { - r1 = NewSeriesResistor.smart(e1, e2); - r2 = NewParallelResistor.smart(e1, e2); + r1 = new SeriesResistor(e1, e2); + r2 = new ParallelResistor(e1, e2); addition.add(r1); addition.add(r2); });