I’m trying to use the transform command to reduce my shape. To give an example of what i want to accomplish, Lets say I have shape 1 (no face) and would like to scale it down to be like shape 2

One thing I’ve tried is calculate for the area of both of the shape then divide them like this

smaller polygon area / larger polygon area but if I use it to scale it can’t get it to match shape 2

I understand that the scale that is needed for the transformation is the “global scale factor” but where do i get it from?

Are the shapes groups or component instances ?

If yes, then see these posts for getting the scales of instances:

How to check if 2 transformation are same? - #4 by DanRathbun

… or …

Face#area weird behavior - #6 by Aerilius

If not, get the scale by using the edges.

```
scale = edge1_of_shape2 / edge1_of_shape1
```

Area is a quadratic quantity, whereas the scale is linear. So you need to use the square root of the ratio of the areas. Math.sqrt(150.0/337.5) = 0.66666666

Actually the shapes are just an array points (Geom::Point3D) . So I cant reference it back to edges

You are dribble-feeding us details that affect the answer!

If all you have are points and you know how to pick corresponding pairs of points in the two shapes, you can use

```
point1.distance(point2)
```

to get how far apart they are. The ratio of distances will be the scale factor.

Sorry if I missed some details just to be clear here’s a sample code that im using to generate the scaled down face

```
def scale(original_pts, transformed_pts)
scale_factor = calculate_scaling_factor(original_pts, transformed_pts)
# for now this is not returning the correct factor
t = Geom::Transformation.new(scale_factor)
new_face = points.map{|pt|pt.transform(t) }
Sketchup.active_model.entities.add_face(new_face)
end
# based on @slbaumgartner previous comment
def calculate_scaling_factor(original_pts, transformed_pts)
original_initial_length = original_pts[0].distance(original_pts[1])
transformed_initial_length = transformed_pts[0].distance(transformed_pts[1])
Math.sqrt((original_initial_length / transformed_initial_length).abs)
end
```

In this drawing I have a 15x15 inches box and i would like to generate or scale it down to 10x10 but the scaling still doesn’t get the exact dimension of 10x10. Based on the formula I would get a value of `0.816496580927726`

and to add I’ve tried moving the edges to a component just not to bump into the face that i created that has the same dimension of my original points and found out that I should get

`~0.67`

for the scale

currently using a quadrilateral shape for now but the shape could be any polygon shaped points

Thanks already using it to transform all the points in the code. I think what im lacking now is how do i get the scaling factor that i should be using to generate the exact scale

You misunderstood me. You need a square root if you are comparing areas. If comparing distances you just need to divide.

Thanks! It returns the same shape now