Page 46 of 51

Re: Software that makes placemats

Posted: 23:14 Tue 28 Aug 2018
by jdaw1
g-man wrote: 01:13 Tue 28 Aug 2018The vintage stars themselves I find a little too cluttered for the overall appearance that I'm distracted with the fill and not the vintage date itself.
I suggest /ShapesInTitles false def as the perfect solution.

Re: Software that makes placemats

Posted: 09:11 Wed 29 Aug 2018
by PhilW
jdaw1 wrote: 23:14 Tue 28 Aug 2018
g-man wrote: 01:13 Tue 28 Aug 2018The vintage stars themselves I find a little too cluttered for the overall appearance that I'm distracted with the fill and not the vintage date itself.
I suggest /ShapesInTitles false def as the perfect solution.
Or just using a different shape from the options available; I think gman was saying he didn't like that particular fill, and I'm sure we all have our preferences and dislikes in that regard (and false is already the default for /ShapesInTitles in the current placemat.ps anyway, for anyone wondering).
g-man wrote: 01:13 Tue 28 Aug 2018
Glenn E. wrote: 21:46 Sat 21 Jul 2018 (The overtitles example looks bad to me, and not due to alignment. I would not put the pattern in the overtitle as it makes that word too difficult to read. Especially in the busy parts in 'pe' and 'ia'.)
I agree with this, the pattern in the over label is completely distracting when placed over the vintage stars.
In agreement with the above view, though I realise this is in disagreement with author preference.
Note that there is an equivalent /ShapesInOvertitles parameter, and indeed equivalents for /ShapesInAbovetitles, /ShapesInBelowtitles and /ShapesInPlacenames (noting the latter has missing { } brackets in the definition compared with the peer definitions). These currently all default to be the same as /ShapesInOvertitles but can be changed by the user, so those of us who prefer not to have the pattern in the overtitles can easily change this.

Re: Software that makes placemats

Posted: 21:13 Wed 29 Aug 2018
by jdaw1
PhilW wrote: 09:11 Wed 29 Aug 2018Note that there is an equivalent /ShapesInOvertitles parameter, and indeed equivalents for /ShapesInAbovetitles, /ShapesInBelowtitles and /ShapesInPlacenames (noting the latter has missing { } brackets in the definition compared with the peer definitions).
Note ‘latter’ of two; ‘last’ of three or more.

Geek note: /ShapesInPlaceNames ShapesInTitles def works naturally if ShapesInTitles is a Boolean constant. But if ShapesInTitles is code referencing the likes of WithinTitles, that would fail if referenced in ShapesInPlaceNames. The absence of brackets causes it to fail earlier, and more traceably. So the absence of {} was deliberate.

Re: Software that makes placemats

Posted: 14:00 Sat 03 Nov 2018
by jdaw1
As requested:

Image Image Image

Re: Software that makes placemats

Posted: 15:11 Sat 03 Nov 2018
by DaveRL
Fabulous. Thank you. :D :GoldStar:

Re: Software that makes placemats

Posted: 15:45 Sat 03 Nov 2018
by jdaw1
Anybody else?

Please specify pattern, the number of columns (so far everybody has five), and the number of rows (so far everybody has one).

From the Manual:
/Alternating
Image

/Sideways
Image

/Upright
Image

Re: Software that makes placemats

Posted: 21:09 Sat 03 Nov 2018
by flash_uk
Yes please, alternating.

Re: Software that makes placemats

Posted: 00:57 Sun 04 Nov 2018
by jdaw1
From the current code:

Code: Select all

/TastingNotesStarsNameColsRowsArrangement  % (ASCIIfied Name) NumCols NumRows /Alternating|/Sideways|/Upright
[
	(DRT)  5 1 /Upright      (Derek T.)    4 copy pop
	(WPS)  5 1 /Sideways     (Wolfgang S.) 4 copy pop
	(PW)   5 1 /Sideways     (Phil W.)     4 copy pop
	(DJ)   5 1 /Sideways     (Daniel J.)   4 copy pop
	(IDJ)  5 1 /Alternating  (Ian J.)      4 copy pop
	(DRL)  5 1 /Alternating  (Dave L.)     4 copy pop
	(TC)   5 1 /Alternating  (Tony C.)     4 copy pop
	(MPM)  5 1 /Alternating  (Mike M.)     4 copy pop
] def  % /TastingNotesStarsNameColsRowsArrangement

Re: Software that makes placemats

Posted: 00:26 Wed 06 Feb 2019
by jdaw1
Geeks might be interested in the comp.lang.postscript thread Mathematical functions as a single Bézier cubic, as used in the Spirals feature (which, note to self, I need to document).

Re: Software that makes placemats

Posted: 23:32 Wed 03 Apr 2019
by jdaw1
For the few who care, HeapSort has been replaced by ShellSort, with gap sequence 1 2 5 11 23 51 113 247 541 1189 2617 5761 12671 27877 61331 134933 296843 653057 1436731 3160811 6953783 15298321 33656309 74043881 162896543 358372411 788419321 1734522497, each being the nearest to 2.2× previous, subject to being coprime to all previous except 1. (Of course, as the maximum array length in most implementations of PostScript is 65535, usually only the bolded gaps are relevant.)

Code for both, and a speed comparison, is in ShellSort_HeapSort.ps. It seems that ShellSort is better for arrays of length ≤ 216−1, but the extent of the advantage diminishes with length. So it may well be that for arrays of length millions or billions, HeapSort is better. But for arrays as short as PostScript’s longest, ShellSort seems to be faster.

Re: Software that makes placemats

Posted: 12:09 Sun 09 Jun 2019
by jdaw1
There have been few instances of old versions being printed, perhaps because of caching problems.

One solution — rejected here — would be to have many separate file names. I dislike that, because I don’t want many versions existing after, and I want a single canonical-seeming file name.

A different technique is something I don’t know how to do. In the PDF, presumably added via pdfmark, could be something like the following pseudocode:

Code: Select all

On Open
{
	If Today ≤ HardWiredDateConstantBeingDateOfTasting
	{
		MessageBoxPopUp 
			string="This version HardWiredStringConstant: check that is latest with a force-reload."
			Buttons={"OK, checked"}
	}
}
Do any readers of thread 175 know how to implement this in a PDF? Advice and guidance welcomed.

Edit, Aug 2021: also asked in github.com/jdaw1/placemat/issues/152, and on comp.lang.postscript.

Re: Software that makes placemats

Posted: 23:00 Sun 16 Jun 2019
by akzy
I used the placemats last night for a small tasting among a few physicists. Naturally, we decided to have field lines drawn on. I noted in the manual that Julian is displeased by these and whilst they are good for the majority of the page, some of the lines are non-physical (as circled).
e field artifact.PNG
e field artifact.PNG (234.06 KiB) Viewed 45842 times
We then went on to discuss how we would do it ourselves (and is a similar method to how I create electric field simulations for trapped ions) . We believe the best option would be to treat each circle as a point charge and then create a potential map (i.e calculate the voltage across the sheet as superposition of each charge) for the entire sheet. From this grid, we can then perform some numerical differentiation (ideally if the point like nature is interpolated with a "reasonable order" function) to create a vector field (which would correspond to the electric field lines). As for visualization, the field lines would be the back-most image and the tasting circles would terminate drawing of lines such that the point charge wouldn't been seen.

Problems i foresee. How on earth do you,
1. Interpolate in PS
2. Differentiate in PS
3. Use PS

For my work I use Mathematica and its fantastic library of simple to use mathematical functions.

Re: Software that makes placemats

Posted: 23:53 Sun 16 Jun 2019
by jdaw1
• I dislike the whole Rays algorithm. Despite the previous discussion of it way back in summer 2013.

• You say that each circle should be a “point charge”. I suspect that aesthetically that wouldn’t work with the very strong circle motif. The lines need to leave the bounding circle, not a point charge within it. (But each circle cannot be a perfect conductor, as they touch, so would all be at the same charge.)

• Interpolate in Postscript … Differentiate in Postscript. Ans: do the work in Mathematica. Then output it in PostScript. Doh!

Code: Select all

(* PostScriptForm — this version of Jan 2019. *)
(* \
PostScriptForm[] *)
(*
	\
http://mathematica.stackexchange.com/questions/101954/postscriptform-\
or-forthform
	http://mathematica.stackexchange.com/questions/102894/multi-case-\
function-many-single-case-delayed-assignments-or-one-which
*)
Remove[PostScriptForm];
PostScriptForm[thing_Rational] := 
  If[Abs[Denominator[
        thing]/(2^IntegerExponent[Denominator[thing], 2])/(5^
        IntegerExponent[Denominator[thing], 5])] == 1, 
   ToString[N[thing, 20], InputForm, NumberMarks -> False], 
   PostScriptForm[Numerator[thing]] <> " " <> 
    PostScriptForm[Denominator[thing]] <> " div"];
PostScriptForm[thing_?AtomQ] := ToString[thing];
PostScriptForm[thing_List] := 
  StringJoin @@ Riffle[Map[PostScriptForm, thing], "\r\n"];
PostScriptForm[MatrixForm[thing_]] := PostScriptForm[thing];
PostScriptForm[Times[-1, thing_]] := 
  StringJoin[PostScriptForm[thing], " neg"];

PostScriptForm[thing_Power] := (
   	psExponent := Which[
      		# > 5 && Divisible[#, 3], 
      psExponent[#/3] <> " dup dup mul mul",
      		# >= 5 && OddQ[#], 
      "dup " <> psExponent[(# - 1)/2] <> " dup mul mul" ,
      		# >= 4 && EvenQ[#], psExponent[#/2] <> " dup mul",
      		# == 3, "dup dup mul mul",
      		# == 2, "dup mul",
      		# == 1/2, "sqrt",
      		# == 3/2, "dup sqrt mul",
      		# < 0, psExponent[-#] <> " 1 exch div",
      		(Rational === Head[#]) && (Log[2, # // Denominator] // 
         IntegerQ), psExponent[Simplify[2 #]] <> " sqrt",
      		Not[IntegerQ[#]], PostScriptForm[#] <> " exp",
      		# == 1, "",
      		True, 
      " !!!\[Bullet]\[Bullet]\[Bullet]Error with exponent = " <> 
       ToString[#] <> "\[Bullet]\[Bullet]\[Bullet]!!! "
      	] &;
   	Which[
    		thing[[2]] > 0 || Not[IntegerQ[thing[[2]]]], 
    PostScriptForm[thing[[1]]] <> " " <> psExponent[thing[[2]]],
    		thing[[2]] == -1, "1 " <> PostScriptForm[thing[[1]]] <> " div",
    		thing[[2]] == 0, "1",
    		True, 
    "1 " <> PostScriptForm[thing[[1]]] <> " " <> 
     psExponent[-thing[[2]]] <> " div"
    	]);

PostScriptForm[thing_Times] := 
  StringJoin@
   Riffle[Reap[
      If[MatchQ[thing[[1]], 
        Power[_, 
         n_Integer /; n < 0]], (Sow[
          "1 " <> PostScriptForm[thing[[1, 1]]] <> " div"];), (Sow[
          PostScriptForm[thing[[1]]]];)]; 
      Map[(If[MatchQ[#, 
           Power[_, 
            n_Integer /; n < 0]], (Sow[
             PostScriptForm[#[[1]]^(-#[[2]])] <> " div"];), (Sow[
             PostScriptForm[#] <> " mul"]; )]) &, 
       Drop[List @@ thing, 1]]][[2, 1]], " "];

PostScriptForm[thing_Plus] :=
  StringJoin @@ If[FreeQ[thing, _^n_],
    	(* Simple expression, no powers, 
    to be summed one item at a time *)
    	Module[{i},
     		i = 
      Position[thing, Except[Times[-1, _] | (_?Negative)], 1, 
       Heads -> False];
     		If[Length[i] > 0, 
      i = i[[1, 1]], (i = 
        Position[thing, Not[MatchQ[#, Times[-1, _]]] &, 1, 
         Heads -> False]; i = If[Length[i] > 0, i[[1, 1]], 1])];	
     Prepend[
      Map[(" " <> 
          Replace[#, {(n_Integer /; n < 0 :> 
              ToString[-n] <> " sub"), (Times[-1, _] :> 
              PostScriptForm[Times @@ Drop[#, 1]] <> " sub"), (Times[
               n_ /; n < 0, _] :> 
              PostScriptForm[Times @@ Drop[#, 1]] <> " " <> 
               ToString[-#[[1]]] <> " mul sub"), (Times[
               n_ /; n > 0, _] :> 
              PostScriptForm[Times @@ Drop[#, 1]] <> " " <> 
               ToString[#[[1]]] <> " mul add"), (_ :> 
              PostScriptForm[#] <> " add")}]) &, 
       Drop[List @@ thing, {i}]], 
      Replace[thing[[
        i]], {Times[-1, _] :> 
         PostScriptForm[-thing[[i]]] <> " neg", _ :> 
         PostScriptForm[thing[[i]]]}]]  ],
    	(* Polynomial *)
    	Module[{vars, exps, v, rcl, i, firstMul},
     		vars = Variables[thing];
     		exps = Exponent[thing, vars];
     		v = 
      Select[Transpose[{vars, exps}], (#[[2]] == Max @@ exps) &][[1, 
       1]];
     		rcl = Reverse[Map[Factor, CoefficientList[thing, v]]];
     		Reap[
       			i = 1; firstMul = True; 
       If[rcl[[1]] =!= 1, Sow[PostScriptForm[rcl[[1]]]]];
       Map[
        If[# === 0, 
          i++, (Sow[
            If[firstMul && rcl[[1]] === 1, PostScriptForm[v^i] <> " ",
               " " <> PostScriptForm[v^i] <> " mul "] <> 
             If[MatchQ[#, (Times[_?Negative, _] | (_?Negative))], 
              PostScriptForm[-#] <> " sub", 
              PostScriptForm[#] <> " add"]]; i = 1; 
           firstMul = False)] &, Drop[rcl, 1]];
       			
       If[i > 1, Sow[" " <> PostScriptForm[v^(i - 1)] <> " mul "]];
       		][[2, 1]]
     ]];
(Did you really think that the Temple calculations currently in lines 4918–4950 of the code were written by hand?)

Re: Software that makes placemats

Posted: 00:32 Mon 17 Jun 2019
by akzy
So I had a quick play (please ignore the asymmetrical crimes against mathematics) around in mathematica doing a point charge simulation, see below for results. Depending on how the circle is placed over, I think it would look ok?
pointcharge.png
pointcharge.png (118.88 KiB) Viewed 45825 times

I like the idea of doing it in Mathematica. I presume this is some sort of language converter?

Re: Software that makes placemats

Posted: 06:52 Mon 17 Jun 2019
by jdaw1
Interesting. What charge did you give each point? By what algorithm should the charges be chosen? And please post the code that made the diagram.

Re: Software that makes placemats

Posted: 19:02 Mon 17 Jun 2019
by akzy
Below is the code I used. I've changed things slightly so that it can all be solved analytically. Firstly, we define a series of vectors in circlepos which correspond to x,y and charge respectively. Set these however you please (I'd suggest arranging as a n/quadrupole- only because of the work i do https://en.wikipedia.org/wiki/Quadrupole_ion_trap) . The function pot[] then calculates the potential (analytically). This is then summed over all potentials and differentiated in both x and y to produce the field in said directions. StreamPlot is then used to visualise it.

Code: Select all

circlepos = {{1, 1, 1}, {1, 2, -1}, {2, 1, 1}, {2, 2, -1}};
p1 = ListPlot[circlepos, PlotRange -> {{0, 3}, {0, 3}}];

pot[x_, y_, qx_, qy_, q_] := q/Sqrt[(x - qx)^2 + (y - qy)^2]

potgridx[x_, y_] = 
  D[Total[Table[
     pot[x, y, circlepos[[i, 1]], circlepos[[i, 2]], 
      circlepos[[i, 3]]], {i, 1, Length[circlepos]}]], x];
potgridy[x_, y_] = 
  D[Total[Table[
     pot[x, y, circlepos[[i, 1]], circlepos[[i, 2]], 
      circlepos[[i, 3]]], {i, 1, Length[circlepos]}]], y];
p2 = StreamPlot[{potgridx[x, y], potgridy[x, y]}, {x, 0, 2.5}, {y, 0, 
    2.5}];
Show[p1, p2]

Re: Software that makes placemats

Posted: 21:04 Mon 17 Jun 2019
by jdaw1
akzy wrote: 00:32 Mon 17 Jun 2019I presume this is some sort of language converter?
Yes. Converts basic expressions to (slightly) idiomatic PostScript. Typical use case is a polynomial to be solved: it converts the CoefficientList, which is then passed to a PostScript polynomial solver.

E.g.: PostScriptForm[(a + Sqrt[b])^15]a b sqrt add dup dup mul dup mul mul dup dup mul mul


Your approach is well suited to circles in a rectangular grid. Not so much in a hexagonal grid. E.g.:

Code: Select all

circlepos = {
   	{0, 1, 1},
   	{Sqrt[3.]/2, 0.5, -1},
   	{Sqrt[3.]/2, -0.5, 1},
   	{0, -1, -1},
   	{-Sqrt[3.]/2, -0.5, 1},
   	{-Sqrt[3.]/2, 0.5, -1},
   	{0, 0, 1}
   };
What might be need is some sort of chromatic / multi-dimensional field.

Re: Software that makes placemats

Posted: 22:10 Mon 17 Jun 2019
by akzy
jdaw1 wrote: 21:04 Mon 17 Jun 2019 E.g.: PostScriptForm[(a + Sqrt[b])^15]a b sqrt add dup dup mul dup mul mul dup dup mul mul
Love it.
jdaw1 wrote: 21:04 Mon 17 Jun 2019
Your approach is well suited to circles in a rectangular grid. Not so much in a hexagonal grid. E.g.:

Code: Select all

circlepos = {
   	{0, 1, 1},
   	{Sqrt[3.]/2, 0.5, -1},
   	{Sqrt[3.]/2, -0.5, 1},
   	{0, -1, -1},
   	{-Sqrt[3.]/2, -0.5, 1},
   	{-Sqrt[3.]/2, 0.5, -1},
   	{0, 0, 1}
   };
Fixed.

Code: Select all

circlevec = {{0, 1, 1}, {Sqrt[3.]/2, 0.5, -1}, {Sqrt[3.]/2, -0.5, 
    1}, {0, -1, -1}, {-Sqrt[3.]/2, -0.5, 1}, {-Sqrt[3.]/2, 
    0.5, -1}, {0, 0, 1}};
circlepos = 
 Table[{circlevec[[i, 1]], circlevec[[i, 2]]}, {i, 1, 
   Length[circlevec]}];
p1 = ListPlot[circlepos, PlotRange -> {{-2.5, 2.5}, {-2.5, 2.5}}, 
   PlotMarkers -> {Automatic, Large}];

pot[x_, y_, qx_, qy_, q_] := q/Sqrt[(x - qx)^2 + (y - qy)^2]

potgridx[x_, y_] = 
  D[Total[Table[
     pot[x, y, circlevec[[i, 1]], circlevec[[i, 2]], 
      circlevec[[i, 3]]], {i, 1, Length[circlevec]}]], x];
potgridy[x_, y_] = 
  D[Total[Table[
     pot[x, y, circlevec[[i, 1]], circlevec[[i, 2]], 
      circlevec[[i, 3]]], {i, 1, Length[circlevec]}]], y];
p2 = StreamPlot[{potgridx[x, y], potgridy[x, y]}, {x, -2.5, 
    2.5}, {y, -2.5, 2.5}];
Show[p1, p2]
And for those who aren't blessed with Mathematica,
hexcharge.png
hexcharge.png (148.06 KiB) Viewed 45696 times

Re: Software that makes placemats

Posted: 22:45 Mon 17 Jun 2019
by jdaw1
akzy wrote: 22:10 Mon 17 Jun 2019
jdaw1 wrote: 21:04 Mon 17 Jun 2019E.g.: PostScriptForm[(a + Sqrt[b])^15]a b sqrt add dup dup mul dup mul mul dup dup mul mul
Love it.
So do I, but perhaps more for its wilful stubbornness than its practicality.


akzy wrote: 22:10 Mon 17 Jun 2019Fixed.
Hmm. Bug or feature?
• The points south, east-by-north-east and west-by-north-west relate well to the central circle.
• But the points north, east-by-south-east and west-by-south-west do not connect to the central circle at all.

For my palate, this is an offence to symmetry. There’s no a priori reason for the central circle to exhibit such favouritism. You’re trying to squeeze a 2ⁿ pattern into a shape divisible by three, and I think it doesn’t fit.

Others: please take sides.

Some circle arrangements to consider (ignore the decorations): Image

Image

Image Image

Image

Image

Image

Image



I repeat:
jdaw1 wrote: 06:52 Mon 17 Jun 2019By what algorithm should the charges be chosen?

Display: inside the circles is different to outside. Perhaps it should be shown inside faded 60%; and outside at full strength? Comment and recommendation welcomed.

Re: Software that makes placemats

Posted: 23:28 Mon 17 Jun 2019
by akzy
Obviously a feature.

With the asymmetry, it is bothering me too. I have a suspicion that it's because we're working up against imperfect machine precision. If you plot symmetries in along one plane, you might notice there's a field preference to one side. Perhaps the numbers will have to be adjusted so that they can be positions with exact machine precision? I'll have a play and see what I can muster up.

I'll have a look at some previous placemats soon, see what can be made.

As for the algorithm, I'm really not sure. At least there is a flexibility to have any charge (or even strength of charge for that extra special something).

Re: Software that makes placemats

Posted: 23:35 Mon 17 Jun 2019
by jdaw1
FYI, the only floating-point precision in PostScript is single: 23-bit mantissa ≈ one part in eight million; 8 bits exponent so maximum value ≈ ±10³⁸.

Re: Software that makes placemats

Posted: 23:39 Mon 17 Jun 2019
by akzy
jdaw1 wrote: 23:35 Mon 17 Jun 2019 FYI, the only floating-point precision in PostScript is single: 23-bit mantissa ≈ one part in eight million; 8 bits exponent so maximum value ≈ ±10³⁸.
Ok, I will try zeroing at 2^-23.

I also had a little play with some other fun field related plots (whilst trying to diagnose). Whilst just a first attempt, and numbers will have to be fudged to make it look better,
contourpot.png
contourpot.png (72.51 KiB) Viewed 45649 times
Plotted using

Code: Select all

ContourPlot[
 Log[Total[
   Table[pot[x, y, circlevec[[i, 1]], circlevec[[i, 2]], 
     circlevec[[i, 3]]], {i, 1, Length[circlevec]}]]], {x, -2.5, 
  2.5}, {y, -2.5, 2.5}, Contours -> 20]

Re: Software that makes placemats

Posted: 08:20 Tue 18 Jun 2019
by PhilW
jdaw1 wrote: 22:45 Mon 17 Jun 2019Hmm. Bug or feature?
• The points south, east-by-north-east and west-by-north-west relate well to the central circle.
• But the points north, east-by-south-east and west-by-south-west do not connect to the central circle at all.
From the imagery, would I be correct in thinking that each point represents a certain positive or negative charge, and therefore that the reason some points connect to others while others pairs to not is that essentially we are only seeing lines between points of opposite (or different) charge? If so, some variation from binary charge setting would enable alternate maps with all points connecting, though would be potentially difficult to keep regular and symmetrical for all designs without specific rules.

Based on the above, but varying slightly, would making the centre of all circles could be a positive charge, and then placing negative charges between (either in the spaces or the mid-point between adjacent circles) might provide a more fully-connected and symmetric output, though I can't picture whether that might become too linear.

Re: Software that makes placemats

Posted: 12:01 Tue 18 Jun 2019
by akzy
PhilW wrote: 08:20 Tue 18 Jun 2019 From the imagery, would I be correct in thinking that each point represents a certain positive or negative charge, and therefore that the reason some points connect to others while others pairs to not is that essentially we are only seeing lines between points of opposite (or different) charge? If so, some variation from binary charge setting would enable alternate maps with all points connecting, though would be potentially difficult to keep regular and symmetrical for all designs without specific rules.

Based on the above, but varying slightly, would making the centre of all circles could be a positive charge, and then placing negative charges between (either in the spaces or the mid-point between adjacent circles) might provide a more fully-connected and symmetric output, though I can't picture whether that might become too linear.
Good idea. I also changed circlepos to a different hexagonal lattice..

Code: Select all

{{0, 2 Sqrt[2], -1}, {Sqrt[2], Sqrt[2], -1}, {-Sqrt[2], 
  Sqrt[2], -1}, {0, -2 Sqrt[2], -1}, {-Sqrt[2], -Sqrt[2], -1}, {Sqrt[
   2], -Sqrt[2], -1}, {0, 0, 1}}

Re: Software that makes placemats

Posted: 20:39 Tue 18 Jun 2019
by jdaw1
akzy wrote: 12:01 Tue 18 Jun 2019Good idea. I also changed circlepos to a different hexagonal lattice.
Charges good. Because circles touch, hexagonal was better.

How to generalise the charges it to fit
jdaw1 wrote: 22:45 Mon 17 Jun 2019Image
For this type of layout, might a triangle tesselation with charges {⅓,⅔,1} be correct?

Code: Select all

circlevec = {
	{0, 1, 1},
	{Sqrt[3.]/2, 0.5, 1/3},
	{Sqrt[3.]/2, -0.5, 1},
	{0, -1, 1/3}, 
	{-Sqrt[3.]/2, -0.5, 1},
	{-Sqrt[3.]/2, 0.5, 1/3},
	{0, 0, 2/3}
};
p1 = Map[Graphics[{Red, Thick, Circle[{#[[1]], #[[2]]}, 0.5]}] &, circlevec[[All, 1 ;; 2]]];
pot[x_, y_, qx_, qy_, q_] := q/Sqrt[(x - qx)^2 + (y - qy)^2];
potgridx[x_, y_] = 
  D[Total[Table[
     pot[x, y, circlevec[[i, 1]], circlevec[[i, 2]], 
      circlevec[[i, 3]]], {i, 1, Length[circlevec]}]], x];
potgridy[x_, y_] = 
  D[Total[Table[
     pot[x, y, circlevec[[i, 1]], circlevec[[i, 2]], 
      circlevec[[i, 3]]], {i, 1, Length[circlevec]}]], y];
p2 = StreamPlot[{potgridx[x, y], potgridy[x, y]}, {x, -1.6, 
    1.6}, {y, -1.6, 1.6}];
Show[p1, p2, AspectRatio -> 1]
Image
(Alas my Mathematica v9 can’t specify StreamMarkers -> "Segment".)