# Calculating for the scale factor

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) }
end
# based on @slbaumgartner previous comment
def calculate_scaling_factor(original_pts, transformed_pts)
original_initial_length = original_pts.distance(original_pts)
transformed_initial_length = transformed_pts.distance(transformed_pts)
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